امروز پنجشنبه ۱۴۰۰/۰۱/۲۶

2021/04/15 GMT +4:30

» توابع (Functions) در جاوا اسکریپت (JavaScript)

javascript-function

در اغلب زبان های برنامه نویسی توابع (Functions) نقش کلیدی در پیش برد اهداف برنامه نویس و تسهیل روند کدنویسی دارند، توابع مانند ماشین هایی هستند که هر بار با توجه به مواد اولیه ورودی خروجی متفاوتی تولید می کنند، خوشبختانه اصول کلی این مبحث در جاوا اسکریپت (JavaScript) شباهت زیادی به دیگر زبان خانواده برنامه نویسی وب یعنی PHP دارد، این موضوع باعث می شود کاربرانی که دوره جاوا اسکریپت را پشت سر می گذارند با فهم این مبحث در PHP نیز مشکلی نداشته باشند یا در حالت برعکس اگر با PHP آشنا باشیم به راحتی بخش توابع در جاوا اسکریپت را فرا خواهیم گرفت هر چند بهتر است ابتدا زبان های سمت کاربر را یاد بگیریم و سپس به بررسی برنامه نویسی سمت سرور بپردازیم، به هر صورت در ادامه آموزش های مقدماتی جاوا اسکریپت این بار به سراغ بحث توابع رفته ایم.

تابع چیست و چه کاربردی دارد؟


اولین سوالی که ممکن است به ذهنمان برسد این است که اصلا تابع چیست و چه کاربردی دارد؟!
پاسخ این است که در برنامه نویسی توابع یا Functions شبیه ماشین ها در دنیای واقعی هستند که با دستورالعمل ثابت هر بار با توجه به ورودی دریافتی خروجی متفاوتی تولید می کنند، توابع با این هدف در زبان های برنامه نویسی معرفی شده اند تا از چندبارنویسی عملیات های مشابه جلوگیری شود، به طور مثال نرم افزار نصب شده بر روی دستگاه چاپ را در دنیای واقعی تصور کنیم اگر بخواهیم 100 برگ کاغذ را با نوشته های مختلف بدون کمک نرم افزار و به صورت تنظیمات دستی پرینت کنیم قاعدتا زمان بسیار زیادی از ما خواهد گرفت، اما کافی است یک بار برای سخت افزار دستگاه برنامه بنویسیم و هر بار با توجه به تنظیمات مدنظرمان به هر تعداد که می خواهیم خروجی بگیریم، عملکرد توابع در دنیای برنامه نویسی هم بی شباهت به این مثال نیست، در برنامه نویسی شرایطی پیش می آید که یک روند به تعداد خیلی زیاد ممکن است تکرار شود، به طور مثال تنظیم فونت دلخواه در صفحات مختلف، اگر بخواهیم هر بار تمام جزئیات را مورد به مورد برای هر صفحه بنویسیم علاوه بر اینکه این کار وقت زیادی از ما می گیرد باعث افزایش ضریب خطا و حجم کلی کدنویسی صفحات خواهد شد، از این رو روش بهتر و حرفه ای تر آن است که یک بار الگویی را به شکل تابع بنویسیم و هر بار با ورودی های متفاوت (یا مشابه) خروجی مدنظرمان را دریافت کنیم.

شیوه نگارش (Syntax) توابع در جاوا اسکریپت


توابع در جاوا اسکریپت (JavaScript) با عبارت function تعریف و معمولا پارامترهایی به عنوان آرگیومنت (Argument) می پذیرند، آرگیومنت به زبان ساده یعنی همان ورودی هایی که به تابع داده می شود و می تواند از نوع عدد، رشته، آرایه، تابع و... باشد، مثال زیر Syntax صحیح نحوه تعریف یک تابع ساده را در جاوا اسکریپت نشان می دهد:
<script>
function userInfo(u, c){
    var user = 'your username: ' + u + '<br>';
    var country = 'your country: ' + c + '<br>';
    var output = user + country;
    
    return output;
}
document.write(userInfo('admin', 'Iran'));
</script>
توضیح:
- برای تعریف تابع در جاوا اسکریپت از عبارت function استفاده می کنیم.
- نام تابع باید با حروف انگلیسی (یا کاراکترهای _ و $) شروع شود و استفاده از اعداد به عنوان شروع تابع صحیح نیست اما می توانیم در ادامه از اعداد استفاده کنیم به فرض user1Info یا u123_info، دقت کنیم استفاده از کلماتی که به عنوان دستورات خاص در جاوا اسکریپت کاربرد دارند (به فرض var، if، default و...) مجاز نیست، برنامه نویسان برای خواناتر شدن کدها از عبارت های دارای معنی و معمولا به صورت کلمات چندبخشی (به فرض userInfo) استفاده می کنند.
- در نمونه تابع بالا دو آرگیومنت فرضی (u و c) به عنوان نام کاربری و کشور در ورودی دریافت می شود، در نظر گرفتن آرگیومنت برای تابع اجباری نیست و بسته به نیاز برنامه ممکن است تابع با یا بدون آرگیومنت نوشته شود.
- سپس درون تابع (بین کاراکترهای {}) سه متغیر با نام های دلخواه username، country و output تعریف شده که در واقع نهایتا خروجی به صورت
your username: admin
your country: Iran
برگردانده شده و در بیرون از تابع چاپ می شود.
- در قسمت return خروجی تابع ارسال می شود، در اینجا return متغیر output را که خود حاصل جمع دو متغیر name و country است به عنوان خروجی تابع برمی گرداند (به ارسال خروجی تابع در اصطلاح برگردان یا return می گویند)، استفاده از دستور return در تابع اجباری نیست و بسته به نوع تابع و عملیاتی که مد نظر است می توانیم از این دستور استفاده کنیم (معمولا توابع به همراه قسمت return تعریف می شوند).
نکته: در صورتی که در هر قسمت از تابع دستور return اجرا شود، ادامه پردازش کدهای آن (در صورت وجود) متوقف شده و عملیات تابع به پایان می رسد.
- دقت کنیم توابع در جاوا اسکریپت باید حتما با یک دستور یا رویداد فراخوانی شوند به طور مثال بارگذاری کامل صفحه (رویداد onload) یا کلیک کاربر بر روی یک دکمه (رویداد onclick) و...، در حالت عادی صرف وجود یک تابع در صفحه به خودی خود کار خاصی انجام نمی دهد، در مثال بالا فراخوانی تابع با دستور document.write انجام شده که نتیجه را در صفحه وب چاپ می کند.

روش های تعریف تابع در جاوا اسکریپت


همان طور که گفتیم تابع در جاوا اسکریپت (JavaScript) با عبارت function تعریف می شود اما روش های تعریف می تواند بسته به موقعیت و نیاز برنامه متفاوت باشد:
- تعریف تابع به صورت معمول
در این حالت تابع به صورت معمول و با در نظر گرفتن نام اختصاصی تعریف می شود، مثال:
<script>
function addNumbers(num_1, num_2, num_3){
    return num_1 + num_2 + num_3;
}
alert(addNumbers(8, 5, 7));
</script>
با درج این کد در صفحه HTML و اجرای فایل در مرورگر تابع addNumbers فراخوانی و خروجی زیر به صورت پیام هشدار نمایش داده می شود:
20
در این روش تابع به صورت معمول و مستقل تعریف شده است، دقت کنیم استفاده از عبارت addNumbers برای تعریف توابع دیگر در همان صفحه وب ممکن است نتایج ناخواسته در پی داشته باشد و در صورتی که دو تابع هم نام در یک اجرا داشته باشیم مفسر جاوا اسکریپت صرفا آخرین تابع را پردازش می کند.
- تعریف تابع با متغیر
یک روش دیگر تعریف تابع در نظر گرفتن نام به صورت متغیر است، مثال:
<script>
var myFunc;
//var num = 'JS';
var num = 20;
var result;

if(Number.isInteger(num)){
    myFunc = function(num){
        result = num - 5;
        return result;
    }
} else{
    myFunc = function(num){
        result = 'Error! Please Use Integer.';
        return result;
    }
}

alert(myFunc(num));
</script>
در این شیوه فرآیندی که تابع باید اجرا کند ابتدا با دستور شرطی (متد Number.isInteger) ارزیابی و سپس تابع تعریف می شود، با توجه به این نمونه کد اگر ورودی (متغیر فرضی num) برابر مقدار عددی باشد، قسمت اول شرط if اجرا و خروجی به صورت عدد زیر نمایش داده می شود:
15
اما اگر ورودی مقدار غیر عددی باشد (به فرض عبارت JS) خروجی به صورت زیر نمایش داده می شود:
Error! Please Use Integer.
دقت کنیم حتی اگر مقدار عددی را بین علامت های '' در متغیر num قرار دهیم (به فرض '10') در حالت عادی از دید مفسر جاوا اسکریپت مقدار درج شده رشته ای (String) است نه عددی (Integer) و پیام خطا نمایش داده خواهد شد.
- تعریف تابع در تابع دیگر
گاهی مواقع در برنامه نویسی موقعیت هایی پیش می آید که ممکن است به جهت ساختار کدها یا مختصرنویسی و پرهیز از کدنویسی مجزا برای انجام فرآیندهای تکراری نیاز به تعریف تابع در تابع دیگری باشد، مثال:
<script>
function addNumbers(num_1, num_2, num_3){
    var result = num_1 + num_2 + num_3;
    
    function showAlert(){
        alert(result);
    }
    
    return showAlert();
}

addNumbers(1, 5, 7);
</script>
خروجی نمونه کد بالا به صورت پیام هشدار نمایش داده می شود:
13
نکته مهم در این شیوه حدود (Scope) دسترسی به تابع درونی است که فقط در تابع اصلی قابل فراخوانی و استفاده است، به عبارت دیگر در نمونه کد بالا نمی توانیم تابع showAlert را در بیرون از تابع addNumbers فراخوانی کنیم.

حدود دسترسی تابع (Function Scope) در جاوا اسکریپت


منظور از حدود دسترسی یا Scope، وجود یا عدم وجود قابلیت استفاده از پارامترهای تابع (متغیر، تابع، آبجکت و..) در بیرون از تابع یا پارامترهای بیرون از تابع در تابع برای مفسر جاوا اسکریپت در زمان پردازش دستورات است، طبق قوانین زبان جاوا اسکریپت:
- هر متغیر، تابع یا آبجکتی که درون یک تابع تعریف می شود صرفا توسط همان تابع (یا تابعی که درون آن تابع تعریف شده باشد) قابل دسترس است، به طور مثال کد زیر خطا خواهد داشت:
<script>
function myScope_1(){
    var txt = 'Hello!';
}
function myScope_2(){
    return txt;
}
alert(myScope_2());
</script>
چون متغیر فرضی txt در تابع myScope_1 تعریف اما در تابع myScope_2 فراخوانی شده است با اجرای کدها مفسر جاوا اسکریپت خطای زیر را برمی گرداند:
ReferenceError: txt is not defined
بر طبق همین قانون کد زیر صحیح است و خطایی نخواهد داشت:
<script>
function myScope_1(){
    var txt = 'Hello!';
    
    function myScope_2(){
        return txt;
    }
    
    return myScope_2();
}

alert(myScope_1());
</script>
تابع myScope_2 درون تابع myScope_1 تعریف شده و به پارامترهای آن دسترسی دارد، نتیجه اجرای نمونه کد بالا پیام زیر خواهد بود:
Hello!
- متغیرهایی که بیرون از تابع به صورت دسترسی سراسری (Global Scope) تعریف شوند در تابع قابل استفاده و تغییر هستند، مثال:
<script>
var txt;
function myScope_1(){
    txt = 'Hello!';
}
function myScope_2(){
    return txt;
}
myScope_1();
alert(myScope_2());
</script>
متغیر txt در بیرون از توابع تعریف شده و در این حالت دسترسی سراسری یا Global Scope دارد، نتیجه اجرای نمونه کد بالا پیام زیر خواهد بود:
Hello!
نکته: همان طور که در نمونه کد بالا مشخص است متغیرهایی که به صورت سراسری تعریف می شوند در روند اجرای دستورات توسط توابع مختلف قابل تغییر هستند، در اینجا متغیر txt در بیرون از توابع تعریف، در تابع myScope_1 مقداردهی و در تابع myScope_2 فراخوانی شده است.
- توابعی که به صورت مستقل تعریف می شوند دسترسی سراسری Global Scope دارند و می توانیم از آنها در سایر توابع استفاده کنیم، مثال:
<script>
function myScope_1(){
    var txt = myScope_2('Welcome');
    return txt;
}
function myScope_2(str){
    return str + '!';
}
alert(myScope_1());
</script>
نتیجه کد بالا به صورت پیام هشدار و متن زیر نمایش داده می شود:
Welcome!
همان طور که مشخص است از تابع myScope_2 در تابع myScope_1 استفاده کرده ایم.

تابع بازگشتی (Recursive Function) در جاوا اسکریپت


توابع در جاوا اسکریپت این قابلیت را دارند که بسته به نیاز برنامه خودشان را فراخوانی کنند، به این حالت در اصطلاح تابع بازگشتی یا Recursive Function گفته می شود، مثال:
<script>
var num = 0;
function recurFunc(){
    if(num > 10){
        alert(num);
        return true;
    }
    
    num++;
    recurFunc();
}
recurFunc();
</script>
با اجرای این تابع تا زمانی که متغیر num کوچکتر یا مساوی با 10 باشد تابع مقدار متغیر را یک واحد افزایش و مجددا خودش را فراخوانی می کند، برای جلوگیری از دور تکرار بینهایت (infinite loop) تابع باید در مرحله ای خاتمه یابد، این خاتمه معمولا با در نظر گرفتن دستور شرطی (در اینجا if) انجام می شود و با اجرای دستور return دور تکرار خاتمه می یابد (مشابه با عملکرد دستور break در حلقه ها)، بر این اساس نتیجه تابع بالا به صورت زیر خواهد بود:
11
توابع بازگشتی ساز و کاری مشابه حلقه ها (for، while) دارند و با توجه به نیاز برنامه استفاده می شوند.

نحوه فراخوانی توابع در جاوا اسکریپت


توابع در جاوا اسکریپت بدون وجود رویدادها و دستورات کاربردی ندارند، یک رویداد یا دستور به معنی حالتی است که پس از وقوع یا اعمال آن موتور تابع به حرکت می افتد درست شبیه به استارت زدن یک خودرو!
اگرچه به صرف درج تابع در تگ های script می توانیم تابع را فراخوانی کنیم (مانند نمونه کدهای بالا) اما معمولا فراخوانی توابع در جاوا اسکریپت با رویدادها انجام می شود، در مثال زیر شیوه فراخوانی یک تابع را با دو رویداد پرکاربرد onclick (زمانی که کاربر بر روی یک عنصر کلیک می کند) و onload (زمانی که صفحه وب به صورت کامل بارگذاری می شود) بررسی می کنیم:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | فراخواني تابع در جاوا اسکريپت با رويداد onclick</title>
<!-- Webgoo.ir -->
<style>
body {
    font-family: Tahoma, Geneva, sans-serif;
    font-size: 12px;
    direction: rtl;
    line-height: 22px;    
}
a {
    text-decoration: none;
}
</style>
</head>
<body>
<script>
function addNum(num1, num2){
    var elm = document.getElementById('result');
    var output = num1 + num2;
    
    return elm.innerHTML = output;
}
</script>
<noscript>جاوا اسکريپت در مرورگر شما غير فعال است يا پشتيباني نمي شود!</noscript>
<a href="#" onclick="addNum(3, 6);">براي مشاهده نحوه عملکرد تابع در جاوا اسکريپت، کليک کنيد</a>
<div id="result"></div>
</body>
</html>
توضیح:
- تابع بالا با رویداد onclick (کلیک کاربر بر روی لینک) اجرا می شود.
- دقت کنیم در جاوا اسکریپت نحوه تعیین مقادیر در نوع رفتار تابع اثرگذار است، به فرض اگر کد بالا را به صورت زیر فراخوانی کنیم به جای جمع دو عدد، حاصل ترکیب آنها به صورت یک رشته نمایش داده می شود:
//نمایش نتیجه به صورت یک رشته متنی
onclick="addNum('3', '6');"
//نمایش نتیجه به صورت حاصل جمع دو عدد
onclick="addNum(3, 6);"
دلیل این حالت استفاده از عملگر جمع (+) در تابع جاوا اسکریپتی است که هم برای مقادیر رشته ای (String) کاربرد دارد و هم مقادیر عددی (Integer).
- در این نمونه کد از متدهای document.getElementById و innerHTML استفاده شده است که در آموزش های پیش رو به صورت جداگانه در رابطه با آنها خواهیم گفت، فعلا در این حد بدانیم که با متد document.getElementById یک عنصر در صفحه انتخاب و با متد innerHTML مقادیر (کدهای HTML + متن) به عنصر مد نظر اضافه می شود.
در ادامه تابع دیگری را در رویداد onload (بارگذاری کامل صفحه) فراخوانی و با پیش نمایش آنلاین بررسی می کنیم.

پیش نمایش آنلاین


در نمونه کد زیر از رویداد onload (بارگذاری کامل صفحه) برای فراخوانی تابع استفاده کرده ایم که لینک پیش نمایش آنلاین آن نیز جهت بررسی درج شده است:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | فراخواني تابع در جاوا اسکريپت با رويداد onload</title>
<!-- Webgoo.ir -->
<style>
body {
    font-family: Tahoma, Geneva, sans-serif;
    font-size: 12px;
    direction: rtl;
    line-height: 22px;    
}
a {
    text-decoration: none;
}
</style>
</head>
<body>
<noscript>جاوا اسکريپت در مرورگر شما غير فعال است يا پشتيباني نمي شود!</noscript>
با بارگذاری کامل صفحه رویداد onload اجرا شده و تابع welcome فراخوانی می شود.
<script>
function welcome(){
    var text = 'این پیام با فراخوانی تابع در جاوا اسکریپت نمایش داده می شود';
    var output = alert(text);
    
    return output;
}

window.onload = welcome();
</script>
</body>
</html>
پیش نمایش آنلاین
در این نمونه کد هیچ آرگیومنتی برای تابع در نظر نگرفته ایم، قبلا گفتیم که در نظر گرفتن آرگیومنت برای تابع اختیاری است و بستگی به نیاز برنامه دارد.
نکته: استفاده از رویداد onload معمولا می تواند به یکی از شیوه های زیر باشد:
- فراخوانی در تگ body، مثال:
<body onload="welcome();">
- فراخوانی با آبجکت window، مثال:
window.onload = welcome();
نتیجه هر دو روش یکسان است و تفاوت صرفا در شرایطی است که نتوانیم (به دلیل ساختار برنامه) یا نخواهیم (سلیقه برنامه نویس) از یک شیوه استفاده کنیم.
نکته: رویدادها در جاوا اسکریپت تنوع زیادی دارند و محدود به موارد گفته شده (onclick و onload) نمی شوند، در مباحث پیش رو از بخش آموزش های مقدماتی جاوا اسکریپت به صورت مفصل در این خصوص صحبت خواهیم کرد.
دسته بندی: آموزش مقدماتی » JavaScript
related مطالب بیشتر:
» حلقه for و while در جاوا اسکریپت (JavaScript)
» رویدادها (Events) در جاوا اسکریپت (JavaScript)
» عملگرها (Operators) در جاوا اسکریپت (JavaScript)
» کار با متد getElementById و innerHTML در جاوا اسکریپت (JavaScript)
» شروعی بر برنامه نویسی جاوا اسکریپت (JavaScript)
commentنظرات (۵۶ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: ارجمند
۰۴:۱۵ ۱۳۹۹/۰۲/۰۵
درود بر شما
ضمن عرض ادب و احترام
نزدیک به 60 صفحه مطلب در مورد جاوااسکریپت (لعن الله علیه) خواندم اما پاسخ که نگرفتم هیچ گیج هم شدم!
موضوع بسیار ساده هست، من یک گردونه شانس دارم که با هر بار کلیک روی آن، یک مقدار را نشان می دهد، حالا سعی دارم این مقدار را به دیتابیس منتقل کنم؛ این هم کدها:
<div class="spin"><img src="#"></div>
<p></p>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
let num_spin;
let num_case;

const spin = () => {
num_case = Math.floor((Math.random() * 12) + 1);
num_spin = num_case;
console.log(num_spin + " - " + num_spin * 30);

$('.spin>img').addClass('para1');
};

const para2 = () => {
$('.spin>img').fadeOut(200);
$('.spin>img').removeAttr('class');
$('.spin>img').css('transform', 'rotate(' + ((num_spin * 30) - 15) + 'deg)');
$('.spin>img').fadeIn(500);

switch(num_case) {
case 12:
$('p').text('جایزه شما 12000 تومان');
break;
case 11:
$('p').text('جایزه شما 11000 تومان');
break;
case 10:
$('p').text('جایزه شما 10000 تومان');
break;
case 9:
$('p').text('جایزه شما 9000 تومان');
break;
case 8:
$('p').text('جایزه شما 8000 تومان');
break;
case 7:
$('p').text('جایزه شما 7000 تومان');
break;
case 6:
$('p').text('جایزه شما 6000 تومان');
break;
case 5:
$('p').text('جایزه شما 5000 تومان');
break;
case 4:
$('p').text('جایزه شما 4000 تومان');
break;
case 3:
$('p').text('جایزه شما 3000 تومان');
break;
case 2:
$('p').text('جایزه شما 2000 تومان');
break;
case 1:
$('p').text('جایزه شما 1000 تومان');
break;
}

var request = $.ajax({
url: "index.php",
method: "POST",
data: {num_case: num_case},
dataType: "html"
});

request.done(function(msg) {
alert("Request Done: " + msg);
});

request.fail(function(jqXHR, textStatus) {
alert("Request failed: " + textStatus);
});
};

spin();
para2();
</script>
در مورد امنیت هم اگر توضیح دهید
بیشتر سپاسگزار می شوم.
پاسخ: 
برای ارسال مقادیر از جاوا اسکریپت به سرور باید از Ajax استفاده کنید، نمونه تغییرات مورد نیاز در کدهای بالا اعمال شد، دقت کنید اطلاعات (در اینجا مقدار num_case) با متد POST به فایل فرضی index.php ارسال می شود، در این فایل باید با استفاده از دستورات PHP مقدار را با متد POST دریافت و بر اساس نیاز پرس و جوی MySQL بنویسید تا مقدار دریافت شده در دیتابیس سرور ذخیره شود، در نهایت پاسخ متنی در کدهای PHP چاپ و توسط Ajax به صفحه کاربر منتقل و با alert خروجی داده می شود، لذا علاوه بر مبحث ای جکس باید با نحوه کار PHP و MySQL نیز آشنا باشید.
نکته: کدهای شما مبتنی بر کتابخانه جاوا اسکریپتی جی کئوری است.
امنیت بیشتر در قسمت ذخیره سازی اطلاعات در دیتابیس باید مد نظر باشد که خود مبحث مجزا دارد و باید در آموزش های مقدماتی MySQL با این موارد آشنا شوید.
نویسنده: ارجمند
۱۹:۰۴ ۱۳۹۹/۰۲/۰۵
درود بر شما، سپاسگزارم
عالی بود، حالا ارسال امتیاز و پاسخ انجام می شود اما مشکلی بزرگ وجود دارد؛
در فایل مقصد (index.php) کدهای زیر را نوشتم:
<?php
$value = $_POST["num_case"];
var_dump($value);
?>
اما به جای مقدار، null نمایش داده می شود!
هدفم ذخیره اطلاعات در یک جدول دیتابیس هست اما تا مقداری وجود نداشته باشد مسلما چیزی هم ذخیره نمی شود، لطفا راهنمایی بفرمایید.
پاسخ: 
تکه کد ویرایش شده به تنهایی قابل تست است و اگر با echo خروجی بگیرید مشکلی وجود ندارد (تست شد)، لذا اگر ایرادی باشد باید در هنگام استفاده در کد اصلی بروز کند که نیاز به بررسی کل برنامه است. می توانید در کدهای جاوا اسکریپت با دستور alert مقدار num_case را خروجی بگیرید و مطمئن شوید که خالی نباشد، همچنین در کدهای PHP ممکن است مقدار دریافت شود اما در ادامه در دستورات پرس و جوی دیتابیس به فرض به دلیل وجود خطا null ذخیره شود.
نویسنده: علی
۲۰:۵۹ ۱۳۹۹/۰۳/۰۴
با سلام
من یه فانکشن نوشتم چطور میشه از توی جاوااسکریپت اون رو صدا بزنم در حقیقت می خوام از توی جاوا یه فانکشنی که تو جاوا نیست رو صدا بزنم.
یه مثال می زنم: مثلا می خواهیم هر ثانیه توسط فانکشن name نام Ali نمایش داده بشه
<script>
var myVar = setInterval(myTimer, 1000);
function myTimer() {
کد صدا زدن فانکشن name
}
</script>
function name(){echo 'Ali'}
پاسخ: 
اگر فانکشن در کدهای PHP تعریف شده با جاوا اسکریپت نمی توانیم به صورت مستقیم به تابع دسترسی داشته باشیم، راه حل معمول در این مواقع استفاده از ای جکس است، با ای جکس به فایل PHP درخواست ارسال و پاسخ دریافتی را به شکل دلخواه استفاده می کنیم، بسته به ساختار برنامه امکان استفاده ترکیبی از PHP و جاوا اسکریپت به شکل دیگری نیز وجود دارد، آموزش این حالت در سایت منتشر شده که با جستجوی عبارت "استفاده ترکیبی از جاوا اسکریپت و PHP + وبگو" در گوگل می توانید به آن دسترسی داشته باشید.
نویسنده: علی
۱۱:۰۶ ۱۳۹۹/۰۳/۰۸
با سلام و درود فراوان
یه کد جاوا دارم می خوام هر ثانیه نام یه فایل یا پوشه ای رو بگیرم برای مقایسه تا صفحه رو ریلود کنم نام فایل به صورت عدد است مثلا در پوشه dl یک فایل به نام 10.php می باشد یا یک پوشه به نام 10 وجود دارد
/dl/10

<script>
var myVar = setInterval(myTimer, 1000);
function myTimer() {

var myfile = نام فایل یا پوشه;

if (myfile == 10) {
window.location = window.location;
}
}
</script>
چطور نام فایل یا پوشه رو بگیرم
با سپاس فراوان
پاسخ: 
به دلیل مسائل امنیت وب با جاوا اسکریپت نمی توانیم به فایل یا پوشه در سرور یا سیستم کاربر دسترسی مستقیم داشته باشیم، برای دریافت نام فایل یا پوشه موجود در یک دایرکتوری باید ابتدا یک درخواست ای جکس از کدهای جاوا اسکریپت به یک فایل PHP ارسال کنیم و در آن فایل با کدنویسی به صورت نمونه زیر نام فایل یا دایرکتوری مد نظر را در پاسخ چاپ نمائیم:
<?php
$directory = '/path/to/my/directory';
$scanned_directory = array_diff(scandir($directory), array('..', '.'));
echo $scanned_directory[0];
?>

https://www.php.net/manual/en/function.scandir.php
این پاسخ را در جاوا اسکریپت با متد XMLHttpRequest.responseText دریافت کرده و بررسی می کنیم، قاعدتا برای ارسال درخواست از جاوا اسکریپت به سرور و دریافت پاسخ باید با ای جکس و متدهای GET یا POST آشنا باشیم، آموزش این موارد و نحوه ارسال و دریافت اطلاعات به سرور در آموزش های مقدماتی Ajax شرح داده شده که می توانید از نمونه کدهای آن نیز استفاده کنید.
نکته: درخواست های Ajax نباید در فواصل زمانی خیلی کوتاه و پشت سر هم باشند، بهتر است حداقل 10 ثانیه بین هر درخواست فاصله وجود داشته باشد.
نویسنده: یلدا
۲۲:۲۸ ۱۳۹۹/۰۳/۱۷
سلام خسته نباشید
میخواستم بپرسم چجوری برای تولید تمام توابع یک به یک روی یک مجموعه مثلا 5 عضوی کد بنویسم
با تشکر و احترام
پاسخ: 
اگر منظورتان از "مجموعه" آرایه است می توانید به صورت مستقیم یا در حلقه for تابع را با آرگیومنت مد نظر فراخوانی کنید، مثال:
<script>
function testFunction(value){
alert(value);
}

let array = ['A', 'B', 'C'];
testFunction(array[1]);
</script>

<script>
function testFunction(value){
alert(value);
}

let array = ['A', 'B', 'C'];
for(let i = 0; i < array.length; i++){
testFunction(array[i]);
}
</script>
نویسنده: یلدا
۱۷:۴۳ ۱۳۹۹/۰۳/۲۰
سلام
خیلی ممنون از راهنمائی تون
ببخشید امکان دارد الگوریتم این برنامه هم بنویسید
پاسخ: 
منظورتان از "الگوریتم" مشخص نیست؟! نمونه تابع درج شده است، برنامه را در کجا می خواهید استفاده کنید؟ لطفا با جزئیات بیشتر سوالتان و صورت مسئله را مطرح کنید تا امکان راهنمایی دقیقتر میسر باشد.
نویسنده: احسان
۲۱:۰۲ ۱۳۹۹/۰۳/۲۷
سلام من یک کد اسکریپت دارم که به صورت عددی تبدیل شده است. میخواستم بپرسم چطوری میتونم اسکریپت به حالت اولیه نوشته شده برگردانم و تبدیل کنم و آن را ویرایش کنم.
لطفا راهنمایی کنید و اگر امکان دارد لطفا پاسخ و راهنمایی را به جیمیل من نیز ارسال کنید.
تشکر.
پاسخ: 
برگردان سورس کدهای جاوا اسکریپت بستگی به این دارد که از چه روشی برای مبهم سازی یا رمزنگاری استفاده شده باشد، به فرض اگر حالت مبهم سازی (Obfuscate) اعمال شود شانس زیادی برای بازیابی سورس کدها به شکل اولیه وجود ندارد مگر اینکه زمان زیادی صرف و به صورت دستی پارامترها را دوباره نویسی کنید، در صورت تمایل می توانید یک نمونه از کدها را درج کنید تا امکان بررسی دقیقتر فراهم شود.
نویسنده: محمد
۰۱:۱۸ ۱۳۹۹/۱۰/۱۸
سلام خدمت شما دوست عزیز
سوالم این بود میخاستم چندتا مثال از این تابع و چند تابع دیگه از خودتون رو برام مثال بزنید ممنون میشم اگر راهنمایی کنید.
پاسخ: 
منظورتان کدام تابع است؟!
نویسنده: mahdi
۱۱:۵۶ ۱۴۰۰/۰۱/۱۸
سلام وقت بخیر استاد عزیز ، یک تابع رو چطور میشه در جاوا اسکریپت اورراید کرد؟ که مثلا با هر فراخوانی مجدد ، قبلی ها کار نکنند، برای ریسپانسیو میخوام در هر سایز مختلف یه سری متغیرهایی که به تابع ارسال میکنم تغییر کنن (یه اسلایدر که در سایزهای مختلف تعداد مختلفی از بلاک رو نشون میده و سایزشون و سرعت اسلاید شدنشون و تعداد اسلاید شدنشون تغییر میکنه) ، ولی همه توابع همزمان اجرا میشن، در واقع میخوام در هر سایزی از پنجره که تعیین کردم ، اون تابع با پارامترهایی که تغییر میکنن اجرا بشه و باقی توابع از کار بیفتن و برای هر سایز از پنجره همین اتفاق بیفته
خیلی ممنون استاد عزیز موفق باشی
نویسنده: mahdi
۱۲:۳۳ ۱۴۰۰/۰۱/۱۸
سلام استاد عزیز عذر میخوام بار سومه پیام میزارم ، مشکلش از ست اینترول بود که قطع نمیشد و با هم تداخل داشتند ولی بدون ست اینترول که برای اسلاید کردن هست درست کار میکنه ، و مجبور شدم متغیر ست اینترول رو بیرون از تابع اسلایدر تعریف کنم که بتونم بیرون از اون تابع کلیر اینترول کنمش و تابع رو مجددا با پارامترهای تغییر یافته فراخوانی کنم (چه قشنگ دارم حرف میزنم :)))، این گلوبال تعریف کردن ایراد خاصی نداره ؟
این متغیر برای ست اینترول بود که داخل تابع بود ولی گذاشتمش بیرون که بتونم بهش دسترسی داشته باشم
var autoGo;
و این هم کاریه که در هر سایزی که مورد نظر هستش انجام میدم و پارامترهاش تغییر میکنه
clearInterval(autoGo);slider({sliderId : "finslide",width : 4,roll:2},2000)
بنظرتون دارم درست مینویسم؟
استاد عزیز اون فریمورک php رو تقریبا تمومش کردم ، خیلی عالی شده و خیلی شبیه لاراول انجامش دادم و حتی اون قسمتهای تعامل کد php با html که با حالت @ نوشته میشه رو هم پیاده سازی کردم و خیلی جالب بود ، الان دارم یه سری ماژول برای css و js مینویسم و بعدش به امید خدا دیگه فکر کنم تموم بشه ، خیلی ممنون استاد عزیز موفق باشی
پاسخ: 
در کل استفاده از متغیرهای Global مشکلی ندارد به شرطی که اسم یکتایی که امکان تکرار اتفاقی در سایر کدهای صفحه را نداشته باشد انتخاب کنیم (در جاوا اسکریپت تمام فایل های درج شده در صفحه یکجا پردازش می شوند)، به فرض بهتر است از اسم sliderOutoGo به جای outoGo خالی استفاده کنیم تا احتمال تداخل ناخواسته بخصوص در صفحات شلوغ یا صفحاتی که کنترل تمام اسکریپت های آن در دست ما نیست (به فرض کاربران برنامه می توانند سورس را در سایت خودشان در کنار سایر اسکریپت ها استفاده کنند) کاهش یابد.
یک روش حرفه ای برای حل این مشکل استفاده از یک ابر متغیر به صورت نمونه زیر است که تمام فرایندهای زیرمجموعه را در خود جا می دهد تا با سایر کدهای Global Scope تداخل نکنند (صرفا جهت آشنایی و اطلاع بیشتر که چنین روشی هم وجود دارد وگرنه خود ما هم روش معمول را با رعایت قواعد نامگذاری استفاده می کنیم):
<script>
var myMainVar = (function(){
var global_var_1 = 1;
var global_var_2 = 2;

//این تابع بیرون از متغیر اصلی قابل دسترسی نیست
function alertGlobalVar() {
alert('alertGlobalVar in funcA: ' + global_var_1);
}

//روش های فراخوانی در بیرون از متغیر اصلی
return {
funcA: function() {
alertGlobalVar();
},
funcB: function() {
alert('funcB: ' + global_var_2);
}
};
})();


//فرخوانی
myMainVar.funcA();
myMainVar.funcB();

var global_var_1 = 3;
//یا این روش امکان تداخل هم نیست
alert(global_var_1);
</script>
استفاده از setInterval و clearInterval برای اینگونه موارد متداول است و مشکلی ندارد (سورس اسلایدر صفحه ابتدایی سایت را ملاحظه کنید البته سورس کمی مبهم سازی شده).
مشتاقیم برنامه ای که نوشتید را بررسی کنیم، قطعا کارتان دقیق و تمیز است :)
نویسنده: mahdi
۱۵:۴۳ ۱۴۰۰/۰۱/۱۸
سلام استاد عزیز ، بازم معذرت میخوام سوالام زیاد شد ولی همشون در یک موضوع هستن ، تونستم که با این روش برای هر اسلایدر و همینطور برای هر اسلایدر که در سایزهای مختلف پنجره متغیرهای ارسالیش تغییر میکنه و باید مجدد تنظیم بشه یه تفاوتی قائل بشم (تنظیم کرده بودم که موس میره روی اسلایدر کلیر اینترول بشه ، ولی برای تمامی اسلایدرها میشد چون همه با یک اسم ست اینترول شده بودن)
window[data.sliderId];
که تایم ست اینترول هاشون جداگونه عمل کنه اسم هر متغیر ست اینترول رو بصورت داینامیک از آیدی که بصورت پارامتر ازسال میشه گرفتم و استفاده کردم این روش اصولیه؟ آخه خیلی جاها دیدم نوشتن که نباید ازش استفاده کرد ولی بنظرم اگه نباید کلا ازش استفاده کرد پس برای چی وجود داره؟ و فکر میکنم بعضی جاهای خاص مثل الان بشه استفاده کرد نظر شما چیه استاد عزیز ؟ و در کل ایرادش چیه؟
خیلی ممنون استاد عزیز
پاسخ: 
ببینید چرخه کدهای جاوا اسکریپتی که با متدهای مبتنی بر زمان اجرا سر و کار دارند بعضا خیلی حساس و پیچیده می شود و باید دقیق فرآیندهای برنامه Trace و ردیابی شوند، در واقع باید سورس اسلایدری که نوشتید دقیقا بررسی شود تا درک درستی از ساختار طراحی شده و بهترین روش های دسترسی به آرگیومنت ها و فراخوانی های داینامیک و در نهایت بهینه ترین الگوریتم نوشته شود پس خیلی نمی توانیم بدون دیدن کل سورس ها راهنمایی کنیم :)، در مورد window و data اگر کدها را در یک صفحه آنلاین آزمایشی قرار دهید بهتر می توانیم بررسی و راهنمایی کنیم.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- موارد غیرمرتبط با مباحث آموزش ها را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ مختصر داده خواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- از درج عناوین تبلیغاتی در فیلدها خودداری کنید، در صورتی که یادداشت تبلیغاتی تشخیص داده شود حذف خواهد شد.
- تمام یادداشت ها بررسی و زمانی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد خودداری کنید.





6 × 9
 refresh

آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form شریفی
در:
سلام مجدد. من یه سوال خیلی تخصصی دارم. ممنون میشم پاسخ بدین. برای پروژه پایان نامه. دارم روی موتورهای جستجوگر تحقیق میکنم. فرض...
۱۴۰۰/۰۱/۲۵

form شریفی
در:
سلام استاد. من از متد file_get_contents استفاده می کنم برای دریافت اطلاعات از سایت های مختلف. بعضی وقتها سایت ها دیر لود میشه. آیا...
۱۴۰۰/۰۱/۲۵

form hh
در:
سلام خدمت شما بنده یه سوال داشتم تمام مراحل شما رو انجام دادم و نتیجه گرفتم و لازمه یه تشکرم بکنم. وبسایت من،...
۱۴۰۰/۰۱/۲۵

form erfan
در:
سلام من واسه یه دکمه یه محتوایی تعریف کردم که وقتی کلیک شد محتوا رو نشون بده اما تو دوجاش موندم یک اینکه چیکار کنم...
۱۴۰۰/۰۱/۲۱

form mahdi
در:
سلام استاد عزیز ، بازم معذرت میخوام سوالام زیاد شد ولی همشون در یک موضوع هستن ، تونستم که با این روش برای هر اسلایدر...
۱۴۰۰/۰۱/۱۸

form mahdi
در:
سلام استاد عزیز عذر میخوام بار سومه پیام میزارم ، مشکلش از ست اینترول بود که قطع نمیشد و با هم تداخل داشتند ولی بدون...
۱۴۰۰/۰۱/۱۸

form mahdi
در:
سلام وقت بخیر استاد عزیز ، یک تابع رو چطور میشه در جاوا اسکریپت اورراید کرد؟ که مثلا با هر فراخوانی مجدد ، قبلی ها...
۱۴۰۰/۰۱/۱۸

form متین
در:
سلام چجوری برای خود صفحه ادرس بسازیم که سایتی که رو ساختیم رو با دستگاه دیگه پیداش کنیم
۱۴۰۰/۰۱/۱۶

form امیرحسین برزویی
در:
من یک وبلاگ دارم و 9 سالمه من در وبلاگم مداحی می گذارم ولی وقتی قاب گذاشتم از این سایت من دیگه فیلم...
۱۴۰۰/۰۱/۱۶

form بنده خدا
در:
سلام خسته نباشین، خدا قوت. یه سوال دارم. چرا در بخش نظردهی وبلاگ به جای عنوان پست می نویسه مطلب مورد نظر یافت نشد؟!...
۱۴۰۰/۰۱/۱۵

form روح الله
در:
موقعی میخواهم وارد سایت ایران خودرو بشم پیام میده از Ip داخلی استفاده کنید دلیلش چیست
۱۴۰۰/۰۱/۱۴

form غریب
در:
تشکر از شما مشکلم حل شد امیدوارم موفق و پیروز باشید هر جا که هستید
۱۴۰۰/۰۱/۱۱

form غریب
در:
سلام مجدد ممنون و تشکر از کمکتون کد به خوبی کار میکنه اما همچنان من مشکلی دارم که حل نتونستم کنم...
۱۴۰۰/۰۱/۱۰

form غریب
در:
سلام مجدد این کدی که دادید خوب هست ولی من بد و ناقص توضیح دادم توجه کنید کد این هست تقریبا ممنون...
۱۴۰۰/۰۱/۱۰

form غریب
در:
سلام خسته نباشید من کدی دارم که میخوام داخل یه بخشیش نتیجه یه رویداد رو فراخوانی کنم و راهش و نمیدونم اگر میشه کمک...
۱۴۰۰/۰۱/۱۰

form محسن
در:
سلام ، سوال من مربوط به پنل کارگزاری هاست ، وقتی اسم یک سهم (نماد) را در قسمت جست و جو سرچ میکنم...
۱۴۰۰/۰۱/۰۸

form ترجمه
در:
باسلام همه صفحات من دارای دو url می باشد که یکی با حروف کوچک است و دیگری با حروف بزرگ چجوری این مشکل را...
۱۴۰۰/۰۱/۰۸

form سهیل ملکی
در:
سلام خسته نباشید ببخشید من میخوام از تابع navigator.online توی جاوا اسکریپت استفاده کنم تا باهاش بفهمم کاربر آنلاین هست یا نه و اگه بود...
۱۴۰۰/۰۱/۰۴

form Rabbiten
در:
سلام. من چند ماه است که دنبال کد استایل تصویر مثل تبلیغات بالای سایت شما هستم. اما هیچ جا پیدایش نمی کنم. لطف می...
۱۴۰۰/۰۱/۰۱

form mahdi
در:
سلام استاد عزیز سال نو رو تبریک میگم بهتون ، امیدوارم که خودتون و خانوادتون همیشه سالم و سلامت باشید و امسال پر از...
۱۳۹۹/۱۲/۳۰

form korosh abbasy
در:
سلام وقت بخیر ببخشید در مورد این مطلب سوالی پرسیدم شما در مورد output buffering توضیح دادید کد کار نمیکنه میخواستم ببینم نیازی هست من...
۱۳۹۹/۱۲/۲۹

form احمد
در:
سلام مجدد عذرخواهی میکنم یه موردی دیگه بود فراموش کردم در مورد سوال هدر بگم اینکه روی لوکال به هدر ارسال میشه ولی روی هاست...
۱۳۹۹/۱۲/۲۸

form احمد
در:
با سلام خسته نباشید ببخشید قبلا یه سری دستورات جی کوری رو از خودتون گرفتم وقتی فیلدهای فرمم تکمیل شده است توسط هدر بره به...
۱۳۹۹/۱۲/۲۸

form korosh abbasy
در:
سلام دم شما گرم این دستور برای خوندن فایل هم استفاده میشه؟ من میخوام دسترسی تعیین کنم که اگر یک متغییر true...
۱۳۹۹/۱۲/۲۷
  در انتظار بررسی: ۱
 پاسخگویی به سوالات ممکن است تا 24 ساعت زمان ببرد.