Как использовать onclick и ondblclick для элемента?

Я не понимаю, почему об этом никто не говорит, но для меня самым простым решением является использование imp.find_module («modulename») (документация здесь ):

import imp
imp.find_module("os")

Он дает кортеж с дорожкой во второй позиции:

(,
'/usr/lib/python2.7/os.py',
('.py', 'U', 1))

Преимущество этого метода над «проверкой» заключается в том, что вам не нужно импортировать модуль, чтобы сделать его работа, и вы можете использовать строку ввода. Полезно при проверке модулей, вызываемых, например, в другом скрипте.

EDIT:

В python3 модуль importlib должен делать:

Doc из importlib.util.find_spec:

Вернуть спецификацию для указанного модуля.

Во-первых, sys.modules проверяется, был ли модуль уже импортирован. Если да, то возвращается sys.modules [name] .spec. Если для этого параметра установлено значение Нет, то ValueError будет поднят. Если модуль отсутствует в sys.modules, тогда sys.meta_path ищет подходящую спецификацию со значением «path», заданным для искателей. Ничего не возвращается, если никакой spec не найден.

Если имя для подмодуля (содержит точку), родительский модуль автоматически импортируется.

Имя и аргументы пакета работают Аналогично importlib.import_module (). Другими словами, работают относительные имена модулей (с ведущими точками).

blockquote>

24
задан Josh Stodola 9 October 2009 в 21:05
поделиться

2 ответа

Как и Мэтт, у меня было гораздо больше впечатлений, когда я немного увеличил значение тайм-аута. Кроме того, чтобы смягчить проблему двойного срабатывания одиночного щелчка (что мне все равно не удалось воспроизвести с помощью более высокого таймера), я добавил строку в обработчик одиночного щелчка:

el.onclick = function() {
    if (timer) clearTimeout(timer);
    timer = setTimeout(function() { alert('Single'); }, 250);        
}

Таким образом, если щелчок уже настроен на запуск, он очистится, чтобы избежать дублирования "одиночных" предупреждений.

26
ответ дан 28 November 2019 в 21:11
поделиться

Если вы получаете 2 предупреждения, может показаться, что ваш порог обнаружения двойного щелчка слишком мал. Попробуйте увеличить от 150 до 300 мс.

Также - я не уверен, что вам гарантирован порядок, в котором запускаются click и dblclick. Итак, когда ваш dblclick запускается, он очищает событие first click, но если оно срабатывает до второго события 'click', это второе событие все равно будет запускаться само по себе, и вы закончите как с запуском события двойного щелчка, так и с запуском события одиночного щелчка.

Я вижу два возможных решения этой потенциальной проблемы:

1) Установите другой тайм-аут для фактического запуска события двойного щелчка. Отметьте в своем коде, что событие двойного щелчка вот-вот сработает. Затем, когда срабатывает второе событие "одиночный щелчок", он может проверить это состояние и сказать "ой,

2) Второй вариант - поменять местами целевые функции на основе событий щелчка. Это может выглядеть примерно так:

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can stop it
    if(firing) 
      return;

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }

  el.ondblclick = function() {
    firingFunc = doubleClick; 
    // Now, when the original timeout of your single click finishes, 
    // firingFunc will be pointing to your doubleClick handler        
  }
}

По сути, здесь происходит то, что вы позволяете исходному установленному вами таймауту продолжаться. Он всегда будет вызывать firingFunc (); Единственное, что меняется, - это то, на что фактически указывает firingFunc (). При обнаружении двойного щелчка он устанавливает для него значение doubleClick. И затем мы всегда возвращаемся обратно к singleClick по истечении тайм-аута.

У нас также есть переменная "firing", чтобы мы знали, что нужно перехватывать второе событие одиночного щелчка.

Другой альтернативой является полное игнорирование событий dblclick и просто определите его с помощью одиночных щелчков и таймера:

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can set it to doubleClick
    if(firing){
      firingFunc = doubleClick; 
      return;
    }

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }
}

Это не проверено :)

2) Второй вариант - поменять местами целевые функции на основе событий щелчка. Это может выглядеть примерно так:

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can stop it
    if(firing) 
      return;

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }

  el.ondblclick = function() {
    firingFunc = doubleClick; 
    // Now, when the original timeout of your single click finishes, 
    // firingFunc will be pointing to your doubleClick handler        
  }
}

По сути, здесь происходит то, что вы позволяете исходному установленному вами таймауту продолжаться. Он всегда будет вызывать firingFunc (); Единственное, что меняется, - это то, на что фактически указывает firingFunc (). При обнаружении двойного щелчка он устанавливает для него значение doubleClick. И затем мы всегда возвращаемся обратно к singleClick по истечении тайм-аута.

У нас также есть переменная "firing", чтобы мы знали, что нужно перехватить 2-е событие одиночного щелчка.

Другой альтернативой является полное игнорирование событий dblclick и просто определите это с помощью одиночных щелчков мыши и таймера:

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can set it to doubleClick
    if(firing){
      firingFunc = doubleClick; 
      return;
    }

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }
}

Это не проверено :)

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can stop it
    if(firing) 
      return;

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }

  el.ondblclick = function() {
    firingFunc = doubleClick; 
    // Now, when the original timeout of your single click finishes, 
    // firingFunc will be pointing to your doubleClick handler        
  }
}

По сути, здесь происходит то, что вы позволяете исходному установленному вами тайм-ауту продолжаться. Он всегда будет вызывать firingFunc (); Единственное, что меняется, - это то, на что фактически указывает firingFunc (). При обнаружении двойного щелчка он устанавливает для него значение doubleClick. И затем мы всегда возвращаемся обратно к singleClick по истечении тайм-аута.

У нас также есть переменная "firing", чтобы мы знали, что нужно перехватить 2-е событие одиночного щелчка.

Другой альтернативой является полное игнорирование событий dblclick и просто определите это с помощью одиночных щелчков мыши и таймера:

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can set it to doubleClick
    if(firing){
      firingFunc = doubleClick; 
      return;
    }

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }
}

Это не проверено :)

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can stop it
    if(firing) 
      return;

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }

  el.ondblclick = function() {
    firingFunc = doubleClick; 
    // Now, when the original timeout of your single click finishes, 
    // firingFunc will be pointing to your doubleClick handler        
  }
}

По сути, здесь происходит то, что вы позволяете исходному установленному вами тайм-ауту продолжаться. Он всегда будет вызывать firingFunc (); Единственное, что меняется, - это то, на что фактически указывает firingFunc (). При обнаружении двойного щелчка он устанавливает для него значение doubleClick. И затем мы всегда возвращаемся обратно к singleClick по истечении тайм-аута.

У нас также есть переменная "firing", чтобы мы знали, что нужно перехватить 2-е событие одиночного щелчка.

Другой альтернативой является полное игнорирование событий dblclick и просто определите это с помощью одиночных щелчков мыши и таймера:

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can set it to doubleClick
    if(firing){
      firingFunc = doubleClick; 
      return;
    }

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }
}

Это не проверено :)

11
ответ дан 28 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: