Есть ли способ отключить событие, добавленное dojoAttachEvent

#dojo

#dojo

Вопрос:

У меня есть виджет dojo, который использует код пользовательской библиотеки, имеющий ссылку, подобную этой, в своем шаблоне.

 <a href="#" dojoAttachEvent="onclick:_goBack" dojoAttachPoint="backButton">Go Back</a>
  

Мне нужно найти способ отключить это событие от моего виджета. Единственный известный мне способ отключения события — это использовать

 dojo.disconnect(handle)
  

Я мог бы использовать это, если бы подключил событие с помощью dojo,connect(), который возвращает мне дескриптор.
Однако с dojoAttachEvent у меня нет дескриптора события, следовательно, нет способа отключить его.

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

код:

otherWidget.js:

 dojo.provide("otherWidget");
dojo.declare("otherWidget", [], {
    templateString : dojo.cache("otherWidget","templates/otherWidget.html"),
    _goBack: function(){        
        this.destroyWidgetAndRedirect();
    },
    destroyWidgetAndRedirect: function(){       
        //Code to destory and redirect.
    },
});
  

otherWidget.html:

 <div>
<a href="#" dojoAttachEvent="onclick:_goBack" dojoAttachPoint="backButton">Go Back</a>
<!-- Other Widget related code -->
...
</div>
  

myWidget.js:

 dojo.provide("myWidget");
dojo.require("otherWidget");
dojo.declare("myWidget", [], {
    templateString : dojo.cache("myWidget","templates/myWidget.html"),
    this.otherWidget = new otherWidget({}, dojo.byId('otherWidgetContainer'));
});
  

myWidget.html:

 <div>
<div id="otherWidgetContainer"></div>
<!-- My Widget related code -->
...
</div>
  

Есть мысли..
Спасибо.

Комментарии:

1. Чего именно вы пытаетесь достичь? Запретить выполнение события onClick по умолчанию? Я думаю, вам следует использовать точку расширения _goBack через dojo / метод, если это так. Оно будет иметь событие в качестве первого аргумента, и вы можете использовать evt.preventDefault() в начале вашего переопределяющего кода… Смотрите dojotoolkit.org/reference-guide/quickstart /…

2. Привет, Филипп, спасибо за твой ответ. Да, мой последний мотив — предотвратить событие onClick по умолчанию. Не уверен, правильно ли я понял, но в примере с точкой расширения мне пришлось бы изменить код моей библиотеки, чтобы он вызывал onClick? Кроме того, используя это, даже если я добавлю evt.preventDefault в функцию onClick, _goBack и _onClick все равно будут выполняться перед onClick (как в примере по ссылке). По сути, теперь мой запрос заключается в том, где мне написать код переопределения

Ответ №1:

Точки расширения можно использовать непосредственно в вашем html или в javascript. Предположим, что используемый вами виджет называется «my.custom.dojowidget» и что у него есть точка расширения onClick. Я покажу здесь декларативный способ, в вашем html. Попробуйте это :

 <div data-dojo-type="my.custom.widget">
    <script type="dojo/method" data-dojo-event="onClick" data-dojo-args"evt">
         dojo.stopEvent(evt);
         console.debug("did this work ?");
    </script>
</div>
  

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

Итак … основываясь на примере кода, который вы опубликовали в своей правке, я думаю, вам следует сделать следующее :

 <div data-dojo-type="otherWidget">
    <script type="dojo/method" data-dojo-event="destroyWidgetAndRedirect" data-dojo-args="evt">
        dojo.stopEvent(evt);
        // do whatever custom code you want here...
    </script>
</div>
  

Комментарии:

1. onClick, который я хочу предотвратить, находится в теге привязки, является небольшой частью виджета, который я использую. Этот код предотвращает onClick для всего виджета правильно ..?

2. Правильно … можете ли вы опубликовать здесь соответствующие части кода вашего пользовательского виджета (того, который использует виджет «другой»)? Немного сложно снимать в темноте подобным образом…

3. Я соответствующим образом обновил свой ответ… дайте мне знать, если это сработает, поскольку я не смог это протестировать.

4. Я думаю, я понимаю, что вы пытаетесь сделать. Код в основном переопределяет метод destroyWidgetAndRedirect. Программно написанное выглядело бы примерно так (меня не слишком устраивает декларативный стиль :)) .. this.otherWidget.destroyWidgetAndRedirect = function(evt){dojo.stopEvent(evt);} и это действительно решает проблему. 🙂 спасибо за всю помощь!