جافاسكريبت - هل يمكنني استدعاء click() الخاص بـ jQuery لمتابعة رابط إذا لم أقم بربط معالج حدث به باستخدام bind أو click من قبل؟
لدي مؤقت في JavaScript الخاص بي يحتاج إلى محاكاة النقر على رابط للانتقال إلى صفحة أخرى بمجرد انتهاء الوقت. للقيام بذلك، أستخدم دالة jQuery click(). لقد استخدمت أيضًا $().trigger() وwindow.location، ويمكنني جعلها تعمل كما هو مقصود مع الثلاثة جميعًا.
لقد لاحظت بعض السلوك الغريب مع click() وأحاول أن أفهم ما يحدث ولماذا.
أنا أستخدم فايرفوكس لكل شيء أصفه في هذا السؤال، لكنني مهتم أيضًا بما ستفعله المتصفحات الأخرى بهذا.
إذا لم أستخدم $ ('a').bind('click',fn) أو $ ('a').click(fn) لتعيين معالج للحدث، فإن استدعاء $ ('a').click() يبدو أنه لا يفعل أي شيء على الإطلاق. فهو لا يستدعي معالج المتصفح الافتراضي لهذا الحدث، حيث أن المتصفح لا يقوم بتحميل الصفحة الجديدة.
ومع ذلك، إذا قمت بتعيين معالج حدث أولاً، فإنه يعمل كما هو متوقع، حتى لو لم يقم معالج الحدث بأي شيء.
$('a').click(function(){return true;}).click();
هذا يحمل الصفحة الجديدة كما لو أنني قد نقرت على الرابط بنفسي.
سؤالي ذو شقين: هل هذا السلوك الغريب بسبب أنني أفعل شيئًا خاطئًا في مكان ما؟ ولماذا لا يفعل استدعاء click() أي شيء مع السلوك الافتراضي إذا لم أقم بإنشاء معالج بنفسي؟
كما تحدد هوفمان عندما حاول تكرار نتائجي، فإن النتيجة التي وصفتها أعلاه لا تحدث فعليًا. لست متأكدًا من سبب الأحداث التي لاحظتها أمس، لكنني متأكد اليوم أنها لم تكن كما وصفت في السؤال.
إذاً الإجابة هي أنه لا يمكنك "تزوير" النقرات في المتصفح وأن كل ما يفعله jQuery هو استدعاء معالج الحدث الخاص بك. لا يزال بإمكانك استخدام window.location لتغيير الصفحة، وهذا يعمل بشكل جيد بالنسبة لي.
الإجابة رقم 1
الخيار الآخر هو بالطبع استخدام جافا سكريبت العادية:
document.getElementById("a_link").click()
الإجابة رقم 2
مثير للاهتمام، هذا على الأرجح عبارة عن "طلب ميزة" (أي خطأ) لـ jQuery. حدث النقر في jQuery يقوم بتشغيل إجراء النقر (المسمى حدث onClick في DOM) على العنصر فقط إذا قمت بربط حدث jQuery بالعنصر. عليك الذهاب إلى قوائم بريد jQuery (http://forum.jquery.com/) والإبلاغ عن هذا. قد يكون هذا السلوك المرغوب، لكنني لا أعتقد ذلك.
تحرير :
لقد قمت ببعض الاختبارات وما قلته غير صحيح، حتى لو ربطت دالة بعنصر 'a' فإنه لا يزال لا يأخذك إلى الموقع المحدد بواسطة الخاصية href. جرب الكود التالي:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script>
$(document).ready(function() {
/* Try to dis-comment this:
$('#a').click(function () {
alert('jQuery.click()');
return true;
});
*/
});
function button_onClick() {
$('#a').click();
}
function a_onClick() {
alert('a_onClick');
}
</script>
</head>
<body>
<input type="button" onclick="button_onClick()">
<br>
<a id='a' href='http://www.google.com' onClick="a_onClick()"> aaa </a>
</body>
</html>
لا يذهب أبدًا إلى google.com إلا إذا نقرت مباشرة على الرابط (سواء مع الكود المعلق أو بدونه). ولاحظ أيضًا أنه حتى إذا قمت بربط حدث النقر بالرابط، فإنه لا يزال لا يتحول إلى اللون البنفسجي بمجرد النقر على الزر. إنه يتحول إلى اللون البنفسجي فقط إذا نقرت على الرابط مباشرة.
لقد أجريت بعض الأبحاث ويبدو أن .click لا يُفترض أن يعمل مع وسوم 'a' لأن المتصفح لا يدعم "النقر الوهمي" باستخدام جافاسكربت. أعني، لا يمكنك "النقر" على عنصر باستخدام جافاسكربت. مع وسوم 'a' يمكنك تفعيل حدث onClick الخاص به لكن الرابط لن يغير لونه (إلى لون الرابط الذي تم زيارته، الافتراضي هو اللون الأرجواني في معظم المتصفحات). لذلك لن يكون من المنطقي جعل حدث $.click يعمل مع وسوم 'a' لأن فعل الانتقال إلى الخاصية href ليس جزءًا من حدث onClick، بل مبرمج مباشرة في المتصفح.
الإجابة رقم 3
إذا نظرت إلى الكود الخاص بدالة $.click، أراهن أن هناك عبارة شرطية تتحقق لمعرفة ما إذا كان هناك مستمعون مسجلون للعنصر لحدث click قبل أن يستمر. لماذا لا تكتفي بالحصول على سمة href من الرابط وتغيير موقع الصفحة يدويًا؟
window.location.href = $('a').attr('href');
إليك سبب عدم النقر من خلاله. من دالة trigger، مصدر jQuery للإصدار 1.3.2:
// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
event.result = false;
// Trigger the native events (except for clicks on links)
if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
this.triggered = true;
try {
elem[ type ]();
// Prevent Internet Explorer from throwing an error for some hidden elements
}
catch (e)
{
}
}
بعد أن يستدعي المعالجات (إذا وُجدت)، يقوم jQuery بتفعيل حدث على الكائن. ومع ذلك، فإنه يستدعي فقط المعالجات الأصلية لأحداث النقر إذا لم يكن العنصر رابطًا. أعتقد أن هذا تم عمدًا لسبب ما. يجب أن يكون هذا صحيحًا بغض النظر عما إذا كان معالج الحدث معرفًا أم لا، لذلك لست متأكدًا لماذا في حالتك أدى ربط معالج حدث إلى استدعاء معالج onClick الأصلي. سيتعين عليك أن تفعل ما فعلته وأتابع التنفيذ خطوة بخطوة لترى أين يتم استدعاؤه.
