سؤال

أريد أن سجل كل بالنقر على الرابط.

لقد كتب القليل من المسجل ، والتي يمكن أن يطلق عليه من قبل url (إرجاع صفحة فارغة).هذا العنوان هو ما jquery-ajax-الأسلوب.ولكن للأسف ليس كل نقرة يتم تسجيل إذا كان المستخدم يستخدم فايرفوكس (كل شيء يبدو على ما يرام في أي).

لقد حاولت العديد من الأشياء ولكن لا يوجد حل لهذه المشكلة, وقد أي شخص الغراء ؟

HTML-كود:

<a href="http://google.com" onclick="return loggClick();">Click</a>

JS-مسج-Skript:

function loggClick(){
   $.ajax({
        type: "POST",
        url: "Logger.ff", //dynamic url to logging action
        data: {
            sid: 'abc123' //random data
        },
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        cache: false
    });
    return true;
}

تحرير:لقد غاب في المثال الذي يجب أن تمرير معلمات الحيوية في js-الدعوة, حتى انها "غير ممكن" لإزالة onclick-الحدث :(

هل كانت مفيدة؟

المحلول

وأود أن تبدأ التخلص من مضمنة 'onclick' كود ربط الحدث في وقت لاحق:

  <a href="http://google.com" rel="outbound" >Click</a>


   $("a[rel=outbound]").click(function(){ 
        var url = this.href; 
        $.ajax({
        async: false,
        type: "POST",
        url: "Logger.ff", //dynamic url to logging action
        data: {
                sid: 'abc123' //random data
                clicked: url
        },
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        cache: false
     });
     return true; 
  }); 

أيضا ، قد يكون "حالة السباق" التي تحدث.في بلدي على سبيل المثال لدي تعيين المتزامن إلى false.

سيؤدي هذا إلى إيقاف وظيفة عودته و اتباع الرابط قبل الطلب قد تم تنفيذها.

عن المتزامن

سبب استخدام async: false هنا هو الافتراضي ، aync صحيحا ، وهو ما يعني طلب اياكس قد يكون جزئيا تنتقل عن طريق الوقت الذي يرى المتصفح return: true, و يتنقل من الصفحة.

هذا هو أن "حالة السباق" لقد كان الذكر.هنا خدعة رخيصة أن يتجنب ذلك بجعل المتصفح أساسا التوصل إلى وقف حتى اكتمال الطلب ، ومن ثم السماح للمتصفح النقر على الرابط.

أكثر تطورا الإجابة ستكون بعد ذلك العودة "كاذب" (والتي سوف تقتل المتصفحات الأم "اتبع الرابط" السلوك ) ، ثم بعد الحقيقي إعادة توجيه يؤديها في complete وظيفة.

هذا لا يخلو من قضايا العقل ، و يمكن أن يؤدي إلى بطء التصفح السلوك حين يطلب كاملة ، مما يسمح للمستخدمين الوقت انقر فوق الروابط الأخرى التي تظهر أن تفعل شيئا ، ومن ثم في نهاية المطاف طلب واحد يدخل في وقت عشوائي ، تبدو عشوائية التوجيه يحدث.

ومن ثم حلول متقدمة تشمل حجب بقية الصفحة وإعطاء نوع من التقدم دلالة في حين طلب يكمل.

( وبالتالي ، فإن تعقيد هذا الحل هو أمر من حجم الصعب سحب قبالة في مثال بسيط من async: false )

نصائح أخرى

وأعتقد أن السبب FF يعطيك النتائج السيئة لأنك على وشك الخروج من الصفحة قبل يأخذ العمل الوقت لتنفيذه. كما يذكر رابط mhartman إذا كنت تستخدم الهدف على رابط خارجي يجب أن تعمل بشكل جيد. إذا كنت لا تستطيع أن تفعل ذلك فإنك قد تضطر إلى الانتظار لسجل لإكمال، على الرغم من أنك قد ترى تأخير في الملاحة.

كود HTML

<a href="http://google.com" onclick="return loggClick(event);">Click</a>

وعلى

function loggClick(e) {
  if (!e) e = window.event;

  e.preventDefault();  // cancels the link

  var theLink = this.href;  // stores the link for later

  $.ajax({
     async: false,
     type: "POST",
        url: "Logger.ff", //dynamic url to logging action
        data: {
            sid: 'abc123' //random data
        },
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        cache: false,
         complete: function() {
           // navigate when the log completes
           this.location.href = theLink;
         }
    });
    return true;
  }
}

ونهج جانب أكثر الخادم الثاني الذي قد لا يكون لديك فكرة أن يكون لديك صفحة الذي يعالج الموجهات وسجلات البيانات ثم.

وعلى سبيل المثال:

<a href="LoggerRedirect.ff?url=http://google.com">Click</a>

والملصق أعلاه هو الصحيح، فإنه لا يمكن الاعتماد عليها لأنك مغادرة الصفحة قبل أن يحصل على فرصة للدخول عليه.

هل يمكن أن تفعل هذا:

1) عودة كاذبة، وبالتالي فإن أ href غير نشط. 2) تسجيل النقر 3) استخدام location.href لإعادة توجيه إلى رابط لكان قد تم توجيهها إلى

وقد ترى تأخير بسيط إذا كان يستغرق وقتا طويلا للمعالج عند النقر لتنفيذه.

وهذا المثال سوف النار قبالة وظيفة اياكس قبل معالجة النقر على الرابط. لقد وجدت اضطررت للاتصال اياكس بشكل متزامن أو لن يتم تنفيذ POST. في هذا المثال منصبي اياكس هي صفحة PHP الذي يلحق ملف السجل. هذا المثال هو فعال منذ توليها فقط حدثا بنقرة واحدة إلى النافذة. كما أنها لن تتداخل مع مستخدم النقر على الرابط.

//attach click event to window
attachClickEvent = function() {
    $(document).on('click', function(e) { //document for IE8 compatibility
        var element = $(e.target);
        var tag = element.prop('tagName');

        if (tag === 'A') {
            var data = {'title':document.title, 'URL':element.attr('href'), 'origin':location.href};
            logData(data);
        }
    });
}

logData = function(data) {
    $.ajax({
        async: false,
        cache: false,
        type: "POST",
        data: data,
        url: 'logger.php',
        success: function(msg) { 
            //debugging
        },
        error: function() {
            //debugging
        }
    });
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top