javascript - 在 JS 问题中重构 jQuery

标签 javascript jquery refactoring

我经常使用 jQuery,但我意识到我需要更好地理解底层的 Javascript。我已经解决了 AJAX 部分,但仍停留在嵌套函数上。非常感谢任何帮助。

document.onreadystatechange = function() {
  var state = document.readyState;

  if (state == 'interactive') {
    $('#button').on("click", function() {
      $.getJSON(apiurl, function(json) {

        $.each(json.photos.photo, function(i, myresult) {
          apiurl_size = "https//api/myresult";
          $.getJSON(apiurl_size, function(size) {
            $.each(size.sizes.size, function(i, myresult_size) {
              if (myresult_size.width == selected_size) {
                $("#results").append('<p class="col-md-4"><a href="" ><img src="' + myresult_size.source + '"/></a></p>');
              }
            })
          })
        });
      });
    });
  } else if (state == 'complete') {
    document.getElementById('complete');
  }
}

我想知道的是:

  1. 如何在 $('button') 中获取 id 选择器,因为 document.getElementById('button') 返回整个元素,但我无法执行.on click 功能

  2. .getJSON函数分解为纯JS可重用函数

最佳答案

  1. $("#button").on("click", cb_function) 类似于 document.getElementById("button").addEventListener("click", cb_function)。如果您使用的选择器可以匹配多个元素,那么它是类似的,只不过它循环遍历所有返回的元素以向所有元素添加事件监听器。

  2. $.getJSON(URL, cb_function) 创建一个针对 URL 的 AJAX 请求,其 onreadystatechange 回调函数的作用主要是:

    1. 对响应调用 JSON.parse()
    2. 使用解析结果调用 cb_function

一个简单的版本是这样的:

function getJSON(url, cb_function) {
    var xhr = new XMLHTTPRequest();
    xhr.open("GET", url);
    xhr.onreadystatechange = function() {
        if (xhr.readystate == 4 && xhr.status == 200) {
            cb_function(JSON.parse(xhr.responseText));
        }
    }
    xhr.send();
    return xhr;
}

真正的 $.getJSON 允许您向 URL 提供参数,并且它会自动从对象转换为适当的 URL 编码字符串以添加为 URL 参数。但是您的两个调用都没有数据参数,因此这个定义应该适合您。

关于javascript - 在 JS 问题中重构 jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147047/

相关文章:

javascript - 如何在 JQuery 中使用appendTo() 函数显示此小部件?

javascript - 固定页眉和页内 anchor vs. Tripit Slate

javascript - 添加类时单击时停止 jquery 循环函数

javascript - 当使用 ajax 获取 php 文件时,使用来自另一个文件的 PHP 变量

visual-studio-2008 - 使用 Resharper 时关闭 Visual Studio 建议?

javascript - 在从 <body> 标记触发的 AJAX 请求后执行 Chrome 内容脚本

javascript - 在执行时重置 Javascript 中的变量?

java - ChartJS "Unable to get property ' getTime' 未定义或空引用”

design-patterns - 重构帮助-策略模式

java - 重构以将私有(private)字段从一个类移动到它的辅助类?