#javascript #jquery #tipsy
#javascript #jquery #подвыпивший
Вопрос:
Я пытаюсь использовать этот код для обновления резервной копии плагина 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>
Ответ №1:
Либо переместите код из второго блока 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>
Комментарии:
1. исправлена ошибка, но всплывающая подсказка не обновляется. Всегда «Login», никогда не меняется на success или error.
2. Вызов AJAX является асинхронным, что означает, что он выполняет функцию обратного вызова после того, как
.tipsy()
вызов был выполнен. Ознакомьтесь с моим изменением выше, чтобы загрузить tipsy в вашу функцию обратного вызова. Другим решением было бы загрузить tispy таким, какой вы есть, но обновить его в функции обратного вызова (я не знаю плагин лично, поэтому я не уверен, как это сделать).
Ответ №2:
Невозможно изменить fallback
свойство ваших объектов Tipsy после их создания без взлома самого плагина tipsy.
Поскольку fallback
параметр является строкой, он интерпретируется сразу после выполнения $().tipsy({...})
функции. Таким образом, изменение значения переменной a
впоследствии не приведет к изменению fallback
параметра.
Сначала я подумал, что прямое обновление fallback
свойства из $.fn.tipsy.defaults
объекта приведет к этому, но когда создается новый Tipsy
объект, fallback
свойство в основном копируется в него, поэтому оно будет сохранять начальное значение fallback
вечно.
Одним из решений было бы разветвить проект Tipsy и изменить fallback
свойство, чтобы оно принимало либо строку, либо function()
. Подобным образом можно было бы сделать что-то вроде: fallback: function (){ return a;}
.
Комментарии:
1. я создам простую всплывающую подсказку css с динамическим содержимым и исчезновением. Сделайте это простым и решаемым. Спасибо
Ответ №3:
Переместите a
переменную за пределы готовой функции:
<script type="text/javascript">
var a ="Login";
$(document).ready(function () {
Кроме того, не используйте var
ключевое слово в вашей функции успеха. Вы повторно объявляете переменную, а не устанавливаете значение переменной, определенное в начале готовой функции.
success: function (data) {
if (data.livre === 'complete') {
a ="sucess";
} else
a = "Error";
}
Ответ №4:
Вы могли бы сделать ее глобальной. Зависит от того, следует ли вам это делать.
Если все это выполняется в doc ready, нет причин иметь глобальный; вы могли бы просто запустить код из второго docready из ajax success (или завершить, если это соответствует вашим потребностям).
Трудно сказать; не знаю, насколько близки фрагменты к реальности.
Ответ №5:
1) почему у вас есть 2 Document.ready ??
2) вы можете использовать глобальный параметр или $.data для передачи данных.
3) для вашего решения — объявите var a ="Login";
исходящую сторону или используйте самоисполняющуюся функцию, которая сохраняет область видимости для глобального var.