jquery:制作button.click& json打电话一起工作但保持分开

时间:2013-08-19 22:40:16

标签: javascript jquery json function geoip

我有一个加密表单消息的联系表单

<script type="text/javascript" src="jquery-1.10.2.min.js"></script>

<form name="form_contact" method="post" action="/cgi/formmail.pl">
    // other input fields here

    <textarea name="message" id="message" required></textarea>

    <button id="sendbutton" type="submit">Send</button>
</form>

以下Javascript脚本正常工作,当用户点击发送按钮时,会对表单消息执行操作:

$(document).ready(function() {
    $("button[id$='sendbutton']").click(function(){

    //check if the message has already been encrypted or is empty
      var i = document.form_contact.message.value.indexOf('-----BEGIN PGP MESSAGE-----');
      if((i >= 0) || (document.form_contact.message.value === ''))
        {
            document.form_contact.submit(); return;
        }
      else
        {
            document.form_contact.message.value='\n\n'+ document.form_contact.message.value + "\n\n\n\n\n\n\n\n" + "--------------------------" + "\n"

            if (typeof(navigator.language) != undefined && typeof(navigator.language) != null) {
                document.form_contact.message.value=document.form_contact.message.value + '\n'+ "Language: " + (navigator.language);}
            else if (typeof(navigator.browserLanguage) != undefined && typeof(navigator.browserLanguage) != null) {
                document.form_contact.message.value=document.form_contact.message.value + '\n'+ "Language: " + (navigator.browserLanguage); }

            // and here's where the geoip service data should be appended to the form message 
            addGEOIPdata();

            //finally the resulting message text is encrypted
            document.form_contact.message.value='\n\n'+doEncrypt(keyid, keytyp, pubkey, document.form_contact.message.value);
        }
    });
}); 


function addGEOIPdata(){
        $.get('http://ipinfo.io', function(response)
        {            
            $("#message").val( $("#message").val() + "\n\n" + "IP: "+ response.ip  + "\n" + "Location: " + response.city + ", " + response.country);
        }, 'jsonp');
};

嗯,它的工作原理除外:它不会在加密之前将Geoip服务ipinfo.io的响应添加到表单消息

我在其他地方看到了一个jquery JSON调用示例,它将所有代码放在 $ .get(&#39; http://ipinfo.io&#39;中,功能(响应){...}) 但那我想要的东西。
如果ipinfo查询出现问题,那么没有其他可以正常工作 - 正好因为所有内部 $ .get(& #39; http://ipinfo.io&#39;,功能(响应){...})。

换句话说:我如何使我的button.click和我的$ .GET-JSON调用一起工作,这样脚本可以工作但是将它们分开(在button.click之外的JSON),这样如果JSON调用由于某种原因失败了按钮点击功能,其中的所有内容仍然有效吗?

我已经在Javascript中标记了JSON调用的结果应该附加到表单消息的位置。

感谢您的帮助。

<小时/> 修改:

经过10个小时的试验和错误,我最终偶然发现了让它运作的方式:

所以我将geoipinfo查询放入一个单独的脚本中,该脚本在页面加载时获取信息。

$.getJSON("https://freegeoip.net/json/", function (location) {

var results = "\n\n" + "IP: "+ location.ip  + "\n" + "Location: " + location.city + ", " + location.region_name + ", " + location.country_name;

     window.$geoipinfo = results;
 });

然后在我之前发布的另一个脚本中,我将变量$ geoipinfo添加到表单消息中

document.form_contact.message.value=document.form_contact.message.value + §geoipinfo;

似乎$ geoipinfo现在是一个全局变量,因此我可以在函数外部和其他脚本中使用它的内容。

只要它有效,我就不在乎,但也许有人可以告诉我这个解决方案是否符合javascript的规则。

1 个答案:

答案 0 :(得分:1)

jQuery API:http://api.jquery.com/jQuery.get/

指定您可以在.always()中放置一个处理程序,无论get成功还是失败,都会调用它。

$.get('http://ipinfo.io', , function(response)
    {            
        $("#message").val( $("#message").val() + "\n\n" + "IP: "+ response.ip  + "\n" + "Location: " + response.city + ", " + response.country);
    }, 'jsonp').always(function(){
        document.form_contact.message.value='\n\n'+doEncrypt(keyid, keytyp, pubkey, document.form_contact.message.value);
    });