jQuery .on('点击')API调用的问题

时间:2016-08-01 19:14:51

标签: javascript jquery json api

我一直致力于一个简单的天气应用项目。用户在输入元素中输入邮政编码,该输入元素(在点击按钮元素时)对wunderground.com进行API调用。然后从JSON对象中获取一些数据,进行字符串化并插入到DOM中。

(function() {
        var wundergroundAPI = "https://api.wunderground.com/api/3b411ca908826af8/conditions/q/";
        var input = $('input');

        $('#submit').on('click', function() {
            var inputValue = input.val();
            var weatherByZip = wundergroundAPI += inputValue += '.json';
            $.getJSON(weatherByZip, function(json) {
                $('#temp-f')
                .text('Temperature: ' + JSON.stringify(json['current_observation']['temp_f']) + ' F');
                $('#location')
                .text('Location: '+ JSON.stringify(json['current_observation']['display_location']['full']));
                $('#weather')
                .text('Weather: ' + JSON.stringify(json['current_observation']['weather']));
                input.val("");
            })
        });
    })();

jQuery在第一次API调用时工作正常。

GET https://api.wunderground.com/api/3b411ca908826af8/conditions/q/70118.json

但是,第二个API调用没有。

GET https://api.wunderground.com/api/3b411ca908826af8/conditions/q/70118.json06840.json

问题似乎在于我声明weatherByZip变量的方式:

var weatherByZip = wundergroundAPI += inputValue += '.json';

我的意图是每次调用函数时都会更新weatherByZip变量(使用新的inputValue加上.json扩展名)。相反的是,inputValue和.json被附加到先前创建的变量的末尾。

70118.json06840.json
70118.json06840.json90210.json

我如何修复我的jQuery函数以纠正这个问题。也就是说,每次调用该函数(单击一个按钮元素)时,都会发生新的/更新的API调用?

2 个答案:

答案 0 :(得分:3)

将+ =更改为+

var weatherByZip = wundergroundAPI + inputValue + '.json';

wundergroundAPI + = inputValue表示:获取wundergroundAPI的现有值并在其后面连接inputValue的值。这就是你的wundergroundAPI持续变长的原因。

答案 1 :(得分:2)

 var inputValue = input.val();
 var weatherByZip = wundergroundAPI + inputValue + '.json';

更安全的是修剪inputValue,以便在用户添加空格时删除空格。

 var inputValue = input.val().trim();

但是,知道它在IE8中不受支持。你需要一个polyfill。

编辑:正如@Kevin B所提到的, jQuery 提供了一种适用于所有平台的修剪方法。如果您需要支持IE8-或者不想复制/粘贴polyfill,请使用它,如下所示:

var inputValue = $.trim(input.val());