【问题标题】:socket IO anonymous .on() functions cant use jquery套接字 IO 匿名 .on() 函数不能使用 jquery
【发布时间】:2014-06-10 17:59:31
【问题描述】:

我在socketIO的.on函数调用的匿名函数中遇到了Jquery的问题,页面上的所有JS都在下面

$(document).ready(function(){
    $('bar').fadeOut()             // <---- this will work
    socket.on("foo", function( obj ){
        $('bar').html( obj )       // <---- this will work
        $('bar').show()            // <---- this will work
        $('bar').fadeOut()         // <---- this will NOT work
    })
})

我真的很困惑,为什么像 fadeToggle() 和 slideDown() 这样的 Jquery 方法不能在匿名回调中工作,但会在它之外工作,而其他方法在这两者中都工作。

这是控制台错误信息

Uncaught TypeError: undefined is not a function jquery.js:4
hc                          jquery.js:4
ic                          jquery.js:4
kc                          jquery.js:4
g                           jquery.js:4
m.extend.dequeue            jquery.js:3
(anonymous function)        jquery.js:3
m.extend.each               jquery.js:2
m.fn.m.each                 jquery.js:2
m.fn.extend.queue           jquery.js:3
m.fn.extend.animate         jquery.js:4
m.fn.(anonymous function)   jquery.js:4
(anonymous function)        test.js:21 <--- my code section
Emitter.emit                socket.io.js:1295
Socket.onevent              socket.io.js:806
Socket.onpacket             socket.io.js:764
(anonymous function)        socket.io.js:1020
Emitter.emit                socket.io.js:1295
Manager.ondecoded           socket.io.js:352
(anonymous function)        socket.io.js:1020
Emitter.emit                socket.io.js:1295
Decoder.add                 socket.io.js:4935
Manager.ondata              socket.io.js:342
(anonymous function)        socket.io.js:1020
Emitter.emit                socket.io.js:1295
Socket.onPacket             socket.io.js:1731
(anonymous function)        socket.io.js:1548
Emitter.emit                socket.io.js:1295
Transport.onPacket          socket.io.js:2108
Transport.onData            socket.io.js:2100
ws.onmessage

我的问题是发生了什么?这是某种范围问题吗?这个问题出在哪里(我的代码、我的使用、Jquery)?

更新:Vikram Deshmukh 建议引用我想在本地运行的 jquery,其中一半有效。下面是代码和效果。

var obj = $('bar').fadeOut()       // <-- works, fades out early
var selected = $('bar')
$(document).ready(function(){
    $('bar').fadeOut()             // <---- same
    socket.on("foo", function( obj ){
        $('bar').html( obj )       // <---- same
        $('bar').show()            // <---- same
        $('bar').fadeOut()         // <---- same
        obj                    // <--- this will work here
        selected.fadeOut()     // <--- this will FAIL, same error
    })
})

如果...,这可能是一个很好的答案

  1. 我接受它是范围不匹配,看起来是这样,但我想知道如何?我以前做过。
  2. 不那么重要,但如何做到这一点 var obj = $('bar').fadeOut() 不运行代码?

【问题讨论】:

  • .fadeOut() 在匿名函数之外工作??正确的?你仔细检查了吗?
  • 您确定 on() 正在触发吗?尝试控制台日志。我怀疑只有第一个淡出(准备好的)正在触发。我可能是错的。另外,你为什么使用“bar”标签而不是html标签?
  • 是的,如果我有一个警报(“asdasdasd”)它会触发
  • 和@Scott Selby,是的,我觉得这很奇怪
  • 和它的父母一起试试

标签: javascript jquery socket.io


【解决方案1】:

为什么你不记得在局部变量中对对象的引用?这将解决由于范围不匹配而引起的任何问题。

$(document).ready(function(){
    var bar = $('bar');
    bar.fadeOut()             
    socket.on("foo", function( obj ){
        bar.html( obj )       
        bar.show()            
        bar.fadeOut()         
    })
})

【讨论】:

  • 你的意思是像 var doit = $("asd").fadeOut() 并在 socket.on(...) 中调用它
  • 几乎解决了问题并回答了我的问题,我更新了我的原始帖子。
猜你喜欢
  • 1970-01-01
  • 2012-08-03
  • 2019-04-06
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多