Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor:DOM元素在Template.rendered回调函数中尚不存在_Javascript_Jquery_Meteor_User Accounts - Fatal编程技术网

Javascript Meteor:DOM元素在Template.rendered回调函数中尚不存在

Javascript Meteor:DOM元素在Template.rendered回调函数中尚不存在,javascript,jquery,meteor,user-accounts,Javascript,Jquery,Meteor,User Accounts,我正在用Meteor构建一个应用程序,我有一个菜单按钮,它是一个显示和隐藏边栏的切换。(绿色条) 加载页面或用户登录后,如果浏览器宽度大于768px,我想单击“菜单切换”按钮显示它 目前,我通过反应性地检查Meteor.user()来实现这一点,因为如果用户登录并且是第一次登录,则在加载页面后会调用该函数 userEnabled = () -> if Meteor.user() console.log 'user Enabled called ' + menuOpen

我正在用Meteor构建一个应用程序,我有一个菜单按钮,它是一个显示和隐藏边栏的切换。(绿色条)

加载页面或用户登录后,如果浏览器宽度大于768px,我想单击“菜单切换”按钮显示它

目前,我通过反应性地检查Meteor.user()来实现这一点,因为如果用户登录并且是第一次登录,则在加载页面后会调用该函数

userEnabled = () ->
  if Meteor.user()
    console.log 'user Enabled called ' + menuOpen
    if $(window).width() > 768
      if menuOpen is false
        console.log 'reached inside'
        # Need to use setTimeout before clicking because .show-left element has just been added back to the screen, so we need to wait. I don't like this very much, need to find better method.
        setTimeout ->
          $('.show-left').click()
        , 600

Deps.autorun () ->
  userEnabled()
问题是,由于某些原因,在页面加载时,userEnabled()有时会被调用两次,因此它会打开和关闭侧栏。另一个问题是必须使用setTimeout方法等待菜单切换元素存在,以便单击它。如果没有setTimeout,则不会单击元素

So 2问题

1)客户端登录回调被调用两次

2)在单击元素之前,我必须使用setTimeout等待元素存在。

我如何解决这个问题

如果您需要我提供更多信息,请告诉我,非常感谢您的帮助。

解决方案(使用Meteor.defer和回调函数):

请注意,在单击$('.show left')按钮之前,我没有使用setTimeout,而是使用Meteor.defer。defer将等待DOM完全更新并具有所需的所有元素。否则,在尝试访问渲染上的DOM元素时,如果没有此选项,它们最终可能无法工作!将Meteor.defer与回调一起使用,以使用DOM上的事件,或在呈现回调或onAfterAction函数中更新DOM

userEnabled = () ->
  if Meteor.user()
    if $(window).width() > 768
      if !$('.show-left').hasClass 'active'
        # Need to use setTimeout before clicking because .show-left element has just been added back to the screen, so we need to wait. I don't like this very much, need to find better method.
        Meteor.defer ->  
          $('.show-left').click()

Router.map ->
  @route 'template1',
    path: '/template1',
  @route 'addAndSearchPosts',
    path: '/',
    onAfterAction: ->
      userEnabled()