jquery:制作按钮click&json调用一起工作,但保持它们分离

jquery: making button.click & json call work together but keeping them separated

本文关键字:工作 一起 分离 调用 json 按钮 click amp jquery      更新时间:2023-09-26

我有一个联系人表单,可以加密表单消息

<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('http://ipinfo.io',函数(响应){…})但这不是我想要的
如果ipinfo查询出现问题,则其他任何东西都不起作用-确切地说是,因为都在$.get('http://ipinfo.io',函数(响应){…})。

换句话说:我如何让我的button.click和$.GET-JSON调用一起工作,这样脚本就可以工作,但要将它们分开(JSON outer button.clink),这样,如果JSON调用由于某种原因失败,按钮单击函数和其中的所有功能仍然可以工作?

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

谢谢你的帮助。


编辑:

经过10亿小时的试验&错误,我最终偶然发现了一种使其工作的方法:

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

$.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;
 });

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

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

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

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

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);
    });