#javascript #html
#javascript #HTML
Вопрос:
Я хотел бы предоставить ссылку на функцию 1-го js во 2-м js. Я знаю об отдельных функциях и передаваемых переменных и т.д. Однако, как мне дать ссылку на функцию внутри другой функции?
HTML
...
...
<script src="./js/scripts.js">
</script>
<script src="./js/pure-swipe.js">
</script>
scripts.js
@param {HTMLElement} element The Element
var Application = function(element) {
this.init();
};
Application.prototype = {
onClickNext: function() {
this.goToNext();
}
goToNext: function() {
console.log("NEXT");
},
};
window.addEventListener("load", function() {
var elements = Utility.toArray(document.querySelectorAll(Utility.selector("application")));
for (var i = 0; i < elements.length; i ) {
var instance = new Application(elements[i]);
}
});
pure-swipe.js
document.addEventListener('swiped-left', function(e) {
onClickNext(); //Call function here
// ...
});
Ответ №1:
Прикрепите ссылку на глобальный объект (который в браузере является window
)
В приведенном ниже коде я изменил var instance
на window.instance
. Это позволяет вам получить к нему доступ в pure-swipe.js
с помощью window.instance.onClickNext()
// scripts.js
window.addEventListener("load", function() {
var elements = Utility.toArray(document.querySelectorAll(Utility.selector("application")));
for (var i = 0; i < elements.length; i ) {
window.instance = new Application(elements[i]);
}
});
// pure-swipe.js
document.addEventListener('swiped-left', function(e) {
window.instance.onClickNext(); //Call function here
});
Комментарии:
1. Извините, я не понимаю этого. На что именно я должен дать ссылку? Функция или приложение.прототип? Не могли бы вы, пожалуйста, показать мне пример? Спасибо
2. @Saif — покажите свой код — где вы создаете новый
Application
.3. Идеально! Большое спасибо. Так что просто пришлось добавить window к экземпляру. Но есть ли за этим причина? Я имею в виду, почему бы просто не получить доступ к экземпляру переменной напрямую?
4. @Saif потому что они находятся в отдельных файлах. Код в файлах не может взаимодействовать друг с другом напрямую —
pure-swipe.js
hsa понятия не имеет, в каких переменных объявленоscripts.js
, но они выполняются в одном контексте (глобальном контексте браузера). Таким образом, пока вы делаете ссылку доступной в контексте, который могут читать оба файла — например, путем прикрепления ссылок наwindow
объект, — они могут «разговаривать» друг с другом.
Ответ №2:
В этом конкретном примере вам понадобится объект, созданный с помощью new Application
(или аналогичный), который будет иметь onClickNext
на нем наследуемое свойство. Итак, если у вас есть объект, на который ссылается переменная app
, например, тогда:
document.addEventListener('swiped-left', function(e) {
app.onClickNext(); //Call function here
// ...
});
Функция также доступна как Application.prototype.onClickNext
но она явно предназначена для использования как метод, а не напрямую. (Технически, с показанным вами кодом это сработало бы, если бы вы вызывали его напрямую, но я предполагаю, что содержимое goToNext
более сложное, чем просто console.log
. В любом случае, прямой вызов Application.prototype.onClickNext
был бы очень плохой практикой без предоставления ему допустимого this
значения для использования.)
Комментарии:
1. Я пытался с помощью Application.prototype.onClickNext, но он не вызывался. Ошибка «Как в приложении не определено».