سؤال

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

$([whatever]).bind("click", function(e) { e.preventDefault(); });

وفي الواقع ، يمكنني القيام بذلك على كل عنصر تقريبًا باستثناء حقول الإدخال في FF - أي شخص يعرف لماذا أو يمكن أن يوجهني نحو بعض الوثائق؟

إليكم الرمز ذي الصلة التي أعمل معها ، شكرًا يا شباب.

لغة البرمجة:

<script type="text/javascript">
 var r = new RightClickTool();
</script>

<div id="main">
  <input type="text" class="listen rightClick" value="0" />  
</div>

JS:

function RightClickTool(){

var _this = this;
var _items = ".rightClick";

$(document).ready(function() { _this.init(); });

this.init = function() {
 _this.setListeners(); 
}

this.setListeners = function() {
 $(_items).click(function(e) {
  var webKit = !$.browser.msie && e.button == 0;
  var ie = $.browser.msie && e.button == 1;

  if(webKit||ie)
  { 

   // Left mouse...do something()

  } else if(e.button == 2) {
   e.preventDefault(); 

   // Right mouse...do something else();
  }

 });
}

} // Ends Class

تعديل:

آسف ، بعد قراءة التعليقات ، أدرك أنه يجب علي توضيح بعض الأشياء.

1) الرمز أعلاه يعمل ... بمعنى ما. يمكن للرمز الفرز من خلاله النقر على الزر ، ولا يهتم فقط أن أقول E.PreventDefault () ولا تزال قائمة النقر بزر الماوس الأيمن تنبثق. وبعبارة أخرى ، إذا وضعت تنبيهًا على E. ولكن ستحصل على 1 أو 0 لليسار و 2 إلى اليمين ... لكنها تضحك علي فقط ولا تزال تظهر القائمة الافتراضية الملعون!

2) إذا وضعت محدد jQuery على أي عنصر آخر (بخلاف الإدخال) ، فسيعمل كل شيء ، ستحترم FF استدعاء PreventDefault () ولن تظهر قائمة النقر بزر الماوس الأيمن الافتراضي.

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

المحلول 2

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

var _class = "input.hideRightClick";

this.setListeners = function() {
    $(window).click(function(e) {
        if($(e.target).is(_class))
        {
            e.preventDefault(); 
            alert("hide!");
        }
    });
}

نصائح أخرى

حل متصفح متقاطع لتعطيل قائمة السياق الافتراضي:

window.oncontextmenu = function() { return false };

لالتقاط حدث ContextMenu فقط داخل استخدام عنصر معين:

document.getElementById('myElement').oncontextmenu=function(){

    // Code to handle event
    return false;
}

ستحصل على نتائج مختلفة اعتمادًا على سيناريو الحدث والمستعرض الدقيق إذا جربت طرقًا أخرى غير OnContextMenu لمقاطعة حدث النقر بزر الماوس الأيمن.

في jQuery:

$('myElement').bind('contextmenu', function(){

    // Handle right-click event.
    return false;
});

يمكنك أيضًا استخدام حدث jQuery. وهو تحديد الزر الذي تم الضغط عليه ، ولكن لا يزال يتعين عليك إلغاء حدث ContextMenu الافتراضي:

   // Cancel default oncontextmenu event.
    $(element).bind('contextmenu', function(){ return false });

    $(element).mousedown(function(event){

        switch (event.which)

            case 1:
            // Left mouse
            break;

            case 2:
            // Middle mouse
            break;

            case 3:
            // Right mouse.
            break;

    });

لقد اختبرت هذا في IE6 (تحت النبيذ) ، Chrome 11 ، Firefox 3.6 ، Opera 11 و Safari.

لقد اختبرت للتو في Firefox 3.6 وهو يسير في البيان الأول ، وبالتالي فإن E.PreventDefault () لا يتم استدعاؤه أبدًا.

  var webKit = !$.browser.msie && e.button == 0; // TRUE IN FIREFOX 3.6

  var ie = $.browser.msie && e.button == 1;

  if(webKit||ie)
  { 

   // Left mouse...do something()

  } else if(e.button == 2) {
   e.preventDefault(); 

   // Right mouse...do something else();
  }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top