javascript - 提取 jQuery UI 菜单元素并跳转到每个图像

标签 javascript jquery jquery-ui coffeescript

enter image description here

(我的代码也在这里:http://jsbin.com/urupig/4/edit

“下一个”“上一个”按钮可以使用,但“跳转”按钮不起作用。)

您好,我是 JavaScript 和 CoffeeScript 的新手。

我想提取“跳转”元素,并希望从 jQuery UI 菜单跳转到每个图像

下面的代码使用 Flickr API 来处理图像。首先,完成Ajax通信并加载图像的URL。

我想跳转每个图像,但是当单击“Jump”元素的子元素时,控制台中写入“index is out of number”。

HTML:

<body>
<ul id="menu">
    <li><a href="#" id="next">Next</a></li>
    <li><a href="#" id="previous">Previous</a></li>
    <li>
        <a href="#" id="jump">Jump</a>
        <ul id="jump_ul">
        </ul>
    </li>
</ul>
<br />
<div id="images"></div>
</body>

CoffeeScript :

class PhotoTable2
  json: null
  number: null

  constructor:(number) ->
    @number = number

  getData:(successCallback) =>
    $.getJSON(
      'http://www.flickr.com/services/rest/?jsoncallback=?'
        format : 'json'
        method : 'flickr.photos.search'
        api_key : '7965a8bc5a2a88908e8321f3f56c80ea'
        user_id : '29242822@N00'
        per_page : @number
      (data) =>
        @json = data.photos.photo;
        successCallback?())

  url:(index) ->
    item = @json[index]
    itemFarm = item.farm
    itemServer = item.server
    itemID = item.id
    itemSecret = item.secret
    itemPathList =
      'http://farm' + itemFarm + '.static.flickr.com/' + itemServer +
      '/' + itemID + '_' + itemSecret + '_m.jpg'

  putPhoto:(index) ->
    if (0 <= index and index <= (@number - 1))
      $('#images').empty()
      $('#images').append(
        $('<h3></h3>')
          .text(@json[index].title)
        $('<a></a>')
          .append(
            $('<img />')
              .attr('src', @url(index))))
    else
      console.log('index is out of number')

    console.log('index: ', index)

$ ->
  index = 0

  photo_table2 = new PhotoTable2(5)
  photo_table2.getData(successCallback = ->
    console.log('Data loaded',photo_table2.json)

    photo_table2.putPhoto(index)

    $('#next')
      .click ->
        index++
        photo_table2.putPhoto(index)

    $('#previous')
      .click ->
        index--
        photo_table2.putPhoto(index)

    for i in [0..(photo_table2.number - 1)]
      $('#jump_ul').append(
        $('<li></li>').append(
          $('<a></a>')
            .text(photo_table2.json[i].title)
            .click ->
              photo_table2.putPhoto(i)
            console.log(i)
        )
      )

    $("#menu").menu()
  )

谢谢你的好意。

最佳答案

您遇到了标准的“循环闭包问题”。您会注意到 console.log('index: ', index) 总是显示 5;这是因为点击处理程序最终共享对同一 i 的一个引用,并且该 i 的值将是 i 中的最终值for i in [0..(photo_table2.number - 1)] 循环。

标准解决方案是将循环体包装在自执行函数中,以强制在您需要时对 i 进行求值。 CoffeeScript 提供do (请参阅该部分的底部)专门用于此目的:

for i in [0..(photo_table2.number - 1)]
  do (i) ->
    # Continue as before

演示:http://jsbin.com/urupig/5/edit

关于javascript - 提取 jQuery UI 菜单元素并跳转到每个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13467824/

相关文章:

javascript - 如何使用 JavaScript 或 jQuery 一次拖动多个元素?

html - Bootstrap v2.3.2 菜单在打开/关闭后改变大小

javascript - 尽管向 createStore() 提供了 initialState,但为什么我得到的是 “Reducer [...] returned undefined during initialization”?

javascript - Cucumber JS 获取当前功能/场景/世界步骤

javascript - ASP :Button in jQuery dialog box not firing OnClick event

json - jQuery AJAX JSON 响应返回键 "d"

javascript - watch 和 sass 的不同 grunt 任务

javascript - jqplot 与 jquerymobile 冲突

javascript - 当容器调整大小时使 float div 平滑地移动位置

jquery 模态对话框,可编辑/删除表行