0

我正在尝试使用此代码来更新 Tipsy 插件的后备。如何在第一个函数之外访问变量a ?我可以覆盖变量以进行更新,对吗?

<script type="text/javascript">
$(document).ready(function () {
    var a ="Login";
    $("#login_form").submit(function () {
        var formdata = $("#login_form").serializeArray();
        $.ajax({
            url: "ajax_login.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function (data) {
                if (data.livre === 'complete') {
                    var a ="success";
                } else 
                    var a = "Error";
            }
        });
return false;
    });
});
</script>

<script type='text/javascript'>
$(document).ready(function () {
    $('.login_fields input[rel=tipsy]').tipsy({gravity: 'w', trigger: 'manual', fallback: a }); // a is not defined
});
</script>
4

5 回答 5

3

将第二个 document.ready 块中的代码移动到第一个(这将使a您的调用可以访问该变量.tipsy())或使该a变量成为全局变量。

<script type="text/javascript">
$(document).ready(function () {
    var a ="Login";
    $("#login_form").submit(function () {
        var formdata = $("#login_form").serializeArray();
        $.ajax({
            url: "ajax_login.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function (data) {
                if (data.livre === 'complete') {
                    a ="success";
                } else 
                    a = "Error";
            }
        });
return false;
    });
    $('.login_fields input[rel=tipsy]').tipsy({gravity: 'w', trigger: 'manual', fallback: a });

});
</script>

或者

<script type="text/javascript">
var a = "Login";
$(document).ready(function () {
    $("#login_form").submit(function () {
        var formdata = $("#login_form").serializeArray();
        $.ajax({
            url: "ajax_login.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function (data) {
                if (data.livre === 'complete') {
                    a ="success";
                } else 
                    a = "Error";
            }
        });
return false;
    });
});
</script>

<script type='text/javascript'>
$(document).ready(function () {
    $('.login_fields input[rel=tipsy]').tipsy({gravity: 'w', trigger: 'manual', fallback: a }); // a is not defined
});
</script>

请注意,我var从您的 AJAX 调用的成功回调中删除了声明。

更新

要将更新后的值传递a给 Tipsy,您需要.tipsy()在回调函数中运行调用。您也可以像现在一样运行它并在回调函数中更新 Tipsy 插件(但是我不熟悉该插件并且不知道如何执行此操作):

<script type="text/javascript">
$(document).ready(function () {
    var a ="Login";
    $("#login_form").submit(function () {
        var formdata = $("#login_form").serializeArray();
        $.ajax({
            url: "ajax_login.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function (data) {
                if (data.livre === 'complete') {
                    a ="success";
                } else {
                    a = "Error";
                }
                $('.login_fields input[rel=tipsy]').tipsy({gravity: 'w', trigger: 'manual', fallback: a });
            }
        });
return false;
    });
});
</script>
于 2011-11-08T19:52:53.147 回答
1

fallback在创建 Tipsy 对象后,如果不破解 Tipsy插件本身,就无法更改它们的属性。

给定fallback参数是一个字符串,一旦$().tipsy({...})函数执行,它就会被解释。所以之后改变变量的值a不会改变fallback参数。

我一开始以为直接fallback$.fn.tipsy.defaults对象中更新属性就可以了,但是当一个新Tipsy对象创建的时候,fallback属性基本上是复制进去的,所以会fallback永远存储初始值。

一种解决方案是分叉 Tipsy 项目并更改fallback属性以接受字符串或function(). 像这样可以做类似的事情:fallback: function (){ return a;}.

于 2011-11-08T23:12:03.340 回答
0

a变量移到 ready 函数之外:

<script type="text/javascript">
    var a ="Login";
    $(document).ready(function () {

另外,不要var在成功函数中使用关键字。您正在重新声明变量,而不是设置在准备函数开头定义的变量的值。

 success: function (data) {
            if (data.livre === 'complete') {
                a ="sucess";
            } else 
                a = "Error";
        }
于 2011-11-08T19:52:18.450 回答
0

你可以让它全球化。这是否是你应该做的取决于。

如果一切都准备好在文档中运行,则没有理由拥有全局;您可以从 ajax 成功的第二个 docready 中运行代码(或完成,如果它满足您的需要)。

很难说; 不知道这些片段与现实有多接近。

于 2011-11-08T19:52:42.243 回答
0

1)为什么你有 2 Document.ready ?

2)您可以使用全局参数或 $.data 来传输数据。

3)为您的解决方案 - 声明var a ="Login";外部或使用 self Executing func 保持全局变量的范围。

于 2011-11-08T19:53:41.487 回答