2016-12-12 2 views
0

Я пытаюсь понять, как вызов метода объекта из HTML без объявления этого объекта глобальной переменной. Возможно ли это? Я действительно не хочу загрязнять глобальный масштаб, поэтому я предполагаю, что должен быть способ избежать этого ...Переменная область вызова функции из HTML

Предположим, у меня есть объект javascript, который один из его методов называется clearSelection(). Этот метод clearSelection() просто стирает значение текста ввода html и делает некоторые другие вещи, которые вообще не имеют отношения к этому вопросу.

Проблема заключается в том, что когда я объявляю этот объект внутри $(function(){}); в качестве локальной переменной для этой функции, я не могу получить к нему доступ из атрибута html ввода, поскольку он не определен.

Мое решение для этого было бы объявить этот объект в качестве глобальной переменной, может быть, не прямо внутри window объекта, но что-то менее вредным, как внутри window.document.body (я считаю, что это хуже, пусть он будет объявлен непосредственно внутри объекта окна, так что я думаю, это все равно плохо ...)

Вот код для вас:

Мой объект:

function MyObject(foo,bar){ 
    ... 
    ... 
    this.clearSelection() = function(){ 
     // do some useful stuff here 
     ... 
    } 
} 

теги сценария внутри моей HTML:

<script> 
$(function(){ 
    var myObject = new MyObject(baz,bal); 
}); 
</script> 

Моя кнопка declatarion @ HTML:

<button type="button" onclick="myObject.clearSelection()">Clear</button> 

Так, JavaScript консоль жалуется, потому что myObject не определен, и я предполагаю, что это из-за объема, потому что из HTML я не могу получить доступ к той же области, в которой находится объект (myObject).


Текущий подход

Вот как я это делаю, так что это работает, но мне это не очень нравится, и я прошу еще более чистого способа. Структура объекта и HTML button одинаковы, так что я буду показывать эти:

<script> 
$(function(){ 
    window.document.body.myObject = new MyObject(baz,bal); 
}); 
</script> 
+0

Вы могли бы упростить с помощью 'window.myObject = ...', но лучше, чтобы переместить обработку событий к вашему сценарию, как опубликовал @Satpal. –

+1

[Классы ECMAScript6] (http://exploringjs.com/es6/ch_classes.html) –

ответ

4

Вы должны использовать .on() и связать обработчик событий с помощью JQuery и избавиться от уродливых обработчика рядный щелчка.

Добавить ID свойство button элемент и использовать ID Selector (“#id”)

$(function(){ 
    var myObject = new MyObject(baz,bal); 
    $('#clearSelection').on('click', function(){ 
     myObject.clearSelection(); 
    }) 
}); 

HTML

<button type="button" id="clearSelection">Clear</button> 
+0

ОК, я предполагаю, что это работает, и, конечно же, сделает это так, если я не смогу найти какое-либо другое решение, но я бы хотел понять, почему я не могу получить доступ к объекту из атрибута onclick ... возможно кто-то может указать на другое решение, поддерживающее inline onclick – JorgeGRC

+0

@JorgeGRC. Вы определяете 'myObject' в области документа. Что недоступно глобально, таким образом, вы не можете получить доступ к объекту из атрибута onclick. Вы можете попробовать «var myObject; $ (function() {myObject = new MyObject (baz, bal);}); ' – Satpal

+2

@JorgeGRC События Inline считаются плохой практикой очень и очень долгое время. Этот подход является гораздо более приемлемым и должен рассматриваться как правильный способ решить вашу проблему среди других потенциальных проблем. См. Здесь для некоторой информации ... https://robertnyman.com/2008/11/20/why-inline-css-and-javascript-code-is-such-a-bad-thing/ – Archer

Смежные вопросы