#javascript #sockets #oop
#javascript #сокеты #ооп
Вопрос:
У меня есть пользовательский объект:
function Serverfunctionality(){
this.socket = new WebSocket('ws://localhost:8080');
this.uploaded_image = null
this.sign_up = function (){
this.socket.addEventListener("open" , () => {
console.log('works')
this.send_data();
})
}
}
Затем я вызываю эту функцию следующим образом (которая работает): :
<button id="signupbutton" onclick="new Serverfunctionality().sign_up()" type="button">Sign up</button>
но если бы я хотел, скажем, создать экземпляр объекта и вызвать его в экземпляре. Например:
var main = new Serverfunctionality();
вызов main.sign_up()
не работает.
примечание: файл Serverfunctionality
размещен в другом файле, я связываю файлы html и javascript с помощью следующего тега script: <script src="client.js" type="text/javascript" ></script>
Комментарии:
1. где / как
main
определяется? Этот подход будет работать только в том случае, еслиmain
это глобальная переменная. Это один из нескольких основных недостатков использования встроенныхonclick
атрибутов — гораздо лучше добавлять обработчики событий в JSaddEventListener
.2. @RobinZigmond main определяется внутри client.js файл как глобальная переменная. за пределами объекта.
3. похоже, что независимо от того, что я делаю, я могу вызвать эту функцию только при определении нового экземпляра объекта в той же строке.
4. Какую ошибку вы получаете?
5. @Bergi Я не получаю никаких ошибок, но события функции не запускаются. Я начинаю верить, что это как-то связано с подключением к сокету, поскольку при определении экземпляра объекта соединение затем «открывается».
Ответ №1:
Прослушиватель открытых событий не запускался, потому что соединение уже было установлено в моем экземпляре Serverfunctionality
с this.socket = new WebSocket('ws://localhost:8080');
объявлением внутри схемы элементов объекта. Причина, по которой это работает здесь: <button id="signupbutton" onclick="new Serverfunctionality().sign_up()" type="button">Sign up</button>
это потому, что мы устанавливали соединение при создании экземпляра Serverfunctionality
, поэтому мы смогли обработать событие «открыть».
Вместо того, чтобы пытаться запустить блок кода в случае «открытия». проверьте, открыто ли соединение, а затем запустите, поскольку соединение будет открыто до того, как можно будет нажать кнопку.
код:
this.sign_up = function (){
if (this.socket.readyState == WebSocket.OPEN ) {
console.log('works')
this.socket.send("works")
this.send_data();
}
}