[jquery] جكري كليك - منع نقرات متعددة في الجوال


Answers

استخدام console.log("called") للتحقق من عدد المرات التي يتم استدعاء الزر. لرؤية الإخراج في الكروم تحت عرض-> المطور-> وحدة جافا سكريبت. alert("Play"); سيتم تشغيل مرة واحدة فقط.

Question

أنا باستخدام فونيغاب لبناء بلدي دائرة الرقابة الداخلية / الروبوت التطبيق - في الأساس البعيد التي يمكن أن تحاكي بعض المفاتيح على لوحة المفاتيح الكمبيوتر المحمول. (للتحكم في تشغيل الفيديو وغيرها).

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

ذهبت من خلال عدة وظائف، حيث المشورة العامة هي استخدام 'أونبيند ()' و 'قبالة ()'، ولكن لا شيء يبدو للعمل. مقتطف الشفرة أدناه.

$("#play").off().on('click',function(){
        //alert("Play");

    jQuery.ajax({
    type: "GET",
    async: true,
    url: 'http://'+ip+':10007/function=play?',
    success: function (msg) 
        {  },
    error: function (err)
        { }
    });
});

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

أتحقق من استجابة الخادم مع هذه الشفرة:

while(true) {                
      Socket sock = servsock.accept();                
      System.out.println("Connection from: " + sock.getInetAddress());                
      Scanner in = new Scanner(sock.getInputStream());                
      PrintWriter out = new PrintWriter(sock.getOutputStream());                
      String request = "";                
      while (in.hasNext()) {
          request = in.next( );                
          if (request.contains("function="))
          {
            inputLine = request.split("function=")[1];
            System.out.println ("^^^^^" + inputLine); 
            ...

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

أنا لا أفهم لماذا وليس متأكدا كيف يمكن منعها. أي مؤشرات؟




طريقة واحدة يمكنك اطلاق النار على الحدث انقر مرة واحدة لاستخدام .one () بدلا من. أون () . سيؤدي هذا إلى التأكد من إطلاق الحدث مرة واحدة. بعد اكتمال طلب أجاكس يمكنك إرفاق الدالة .one () مرة أخرى.

ستبدو شفرتك شبيهة بما يلي:

function processOnce() {
    //alert("Play");

    jQuery.ajax({
        type : "GET",
        async : true,
        url : 'http://' + ip + ':10007/function=play?',
        success : function (msg) {
            $("#play").one('click', processOnce());
        },
        error : function (err) {}
    });
}

$("#play").one('click', processOnce());

حل آخر ممكن هو الانتظار ل ديفيسريدي الحدث. حتى في علامة جسمك إضافة هذا:

<body onload="onBodyLoad()">

والكتابة:

<script type="text/javascript">
   function onBodyLoad() {
      document.addEventListener("deviceready", onDeviceReady, false);
   }

   function onDeviceReady() {
      $(function() {
         // bind your elements
      });
   }

وأخيرا، يمكنك إضافة علامة لتحديد ما إذا كانت النقرة قد حدثت سابقا. لذا ستبدو شفرتك كما يلي:

var clicked = false;

$("#play").on('click', function () {
    if (clicked)
        return;

    clicked = true;
    //alert("Play");

    jQuery.ajax({
        type : "GET",
        async : true,
        url : 'http://' + ip + ':10007/function=play?',
        success : function (msg) {
            clicked = false;
        },
        error : function (err) {}
    });
});

آمل أن يساعد هذا.




Links