سؤال

فيما يلي الرمز من البرنامج المساعد لـ Joomla. إنه يعمل بمفرده والغرض منه هو اكتشاف الروابط الخارجية على الصفحة وإجبارها على نوافذ متصفح جديدة باستخدام _blank.

لقد حاولت لمدة ساعة تقريبًا (لا أعرف JavaScript جيدًا) لكن لا يمكنني معرفة كيفية عمل وظيفة onclick.

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

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

عندما أقوم بإنشاء رابط مع

onclick="return ExitNotice(this.href);"
داخلها تعمل بشكل مثالي ، ولكن نظرًا لأن موقع الويب الخاص بي يحتوي على العديد من الأشخاص الذين يقدمون المدخلات ، فأنا أرغب في مربع التأكيد العالمي.

this.blankwin = function(){
  var hostname = window.location.hostname;
  hostname = hostname.replace("www.","").toLowerCase();
  var a = document.getElementsByTagName("a");   
  this.check = function(obj){
    var href = obj.href.toLowerCase();
    return (href.indexOf("http://")!=-1 && href.indexOf(hostname)==-1) ? true : false;              
  };
  this.set = function(obj){
    obj.target = "_blank";
    obj.className = "blank";
  };    
  for (var i=0;i<a.length;i++){
    if(check(a[i])) set(a[i]);
  };        
};

this.addEvent = function(obj,type,fn){
  if(obj.attachEvent){
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn](window.event );}
    obj.attachEvent('on'+type, obj[type+fn]);
  } else {
    obj.addEventListener(type,fn,false);
  };
};
addEvent(window,"load",blankwin);

جزء ثان

/* ----------
  OnClick External Link Notice
---------- */
function ExitNotice(link,site,ltext) {
  if(confirm("-----------------------------------------------------------------------\n\n" + 
    "You're leaving the HelpingTeens.org website. HelpingTeens.org\ndoes not " + 
    "control this site and its privacy policies may differ\nfrom our own. " + 
    "Thank you for using our site.\n\nYou will now access the following link:\n"  + 
    "\n" + link + "\n\nPress \'OK\' to proceed, or  press \'Cancel\' to remain here." + 
    "\n\n-----------------------------------------------------------------------")) 
  {
  return true;
} 
history.go(0);
return false;
}

أ) هل يمكن لأي شخص مساعدتي في إصلاح هذه المشكلة؟ أو ب) هل هناك حل أفضل؟

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

المحلول

لذا ، سألخص ما أعتقد أنك تسأله ثم أخبرك كيف أعتقد أنه يمكن حله. من المحتمل أنني أسيء فهم سؤالك.

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

في هذه الحالة ، أعتقد أنك تريد أن تنتهي الروابط كما لو كانت مكتوبة على هذا النحو:

<a href="javascript:void(0)" onclick="if (ExitNotice('http://www.whatever.com')) window.location.assign('http://www.whatever.com')">

يتسبب JavaScript: Void (0) في معالجة المتصفح العادي للنقرة لعدم الانتقال إلى صفحة أخرى ، بحيث يكون لدى onclick الوقت للتنفيذ.

لتحقيق ذلك ، ستحتاج إلى تغيير تعريف هذا.

  this.set = function(obj){
    var href = obj.href;
    obj.href = "javascript:void(0)";
    obj.onclick = function() { (if ExitNotice(href) window.location.assign(href); };
    obj.target = "_blank";
    obj.className = "blank";
  };

نرى هنا للحصول على معلومات عن void (0).

لاحظ أيضًا أن الكود الذي يحدد OBJ.ClassName إلى "فارغ" ليس رائعًا ، لأنه سيقوم بإزالة أي اسم فئة آخر تم تعيينه بالفعل على الرابط. يمكنك بدلاً من ذلك فقط إضافة اسم الفصل إلى المسافات الموجودة ، مثل ذلك:

obj.className = obj.className + " blank";

نصائح أخرى

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

مرة أخرى ، لقد أظهرت لي بناء الجملة الذي كنت بحاجة لتعديله للحصول على العمل بالطريقة التي أردت.

شكرا لك!

الرمز النهائي

    this.set = function(obj){
            var href = obj.href;
            //obj.href = "javascript:void(0)";
            obj.onclick = function() { return ExitNotice(href)};
            obj.target = "_blank";
            obj.className = obj.className + " blank";
    };

لقد قمت بتحسين الكود أكثر قليلاً. يرجى النظر في تغيير mfblank.js إلى المحتوى التالي. حتى الآن ، يكون كل البرنامج النصي في ملف واحد فقط ويتم إضافة Rel = nofollow إضافية. استمتع بهذا السيناريو ...

this.blankwin = function(){
  var hostname = window.location.hostname;
  hostname = hostname.replace("www.","").toLowerCase();
  var a = document.getElementsByTagName("a");   
  this.check = function(obj){
    var href = obj.href.toLowerCase();
    return (href.indexOf("http://")!=-1 && href.indexOf(hostname)==-1) ? true : false;              
  };  
  this.set = function(obj){
            var href = obj.href;
            obj.onclick = function(){ if(confirm("Do you wanne leave this page?")) {
              return true;
            } 
              history.go(0);
              return false;
            };
            obj.target = "_blank";
            obj.className = obj.className + " blank";
            obj.rel = "nofollow";
    };
    for (var i=0;i<a.length;i++){
        if(check(a[i])) set(a[i]);
    };      
  }; 
  this.addEvent = function(obj,type,fn){
        if(obj.attachEvent){
            obj['e'+type+fn] = fn;
            obj[type+fn] = function(){obj['e'+type+fn](window.event );}
            obj.attachEvent('on'+type, obj[type+fn]);
        } else {
            obj.addEventListener(type,fn,false);
        };
    };
    addEvent(window,"load",blankwin);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top