изменить атрибут заголовка с помощью вызова jQuery ajax.get - PullRequest
0 голосов
/ 23 января 2011

Я пробовал вещи, найденные здесь и в других местах, но, похоже, застрял.Вот что я хочу сделать: нажатие на ссылку должно

  1. переключить класс его родительских элементов
  2. , отправить запрос ajax через GET с идентификатором и заголовком ссылки и изменить заголовок наответ

Я понял # 1 и смог # 2 отправить запрос ajax (и выполнить все, что должен делать вызываемый файл, и его ответ также хорош), но я пытаюсь "присоединить""ответ на заголовок.

Вот мой HTML-код

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>          
<script type="text/javascript">                                         
 $(document).ready(function() {
  $('li div.toggle a').click(function() {
   $.get(
    "test1.php",
    { id: $(this).attr('id'), title: $(this).attr('title') },
    function(data) {
     $.title = data;
    },
    "text");
   $(this).attr('title', $.title);
   $(this).closest('li').toggleClass('highlight');
  });
 });
</script>  
<style type="text/css" media="screen">
 .highlight {
 background: red;
}
</style>
</head>
<body>
<ul>
<li>
 <div>1</div>
 <div class="toggle"><a href="#" id="1" title="this is off">Toggle</a></div>
</li>
<li class="highlight">
 <div>2</div>
 <div class="toggle"><a href="#" id="2" title="this is on">Toggle</a></div>
</li>
</ul>
</body>
</html>

Я попытался вместо $.title = data; использовать $(this).attr('title', data); напрямую, но это не сработало - мое предположениев том, что $(this) на этом этапе в скрипте не является тегом <a>, но я не знаю достаточно jQuery, чтобы понять, как «выбрать» правильный тег <a> по-другому.Во всяком случае, странно то, что это работает так - но только каждый раз!Поэтому click меняет класс, но не заголовок, следующий click снова меняет класс, а теперь и заголовок ...

Затем я попробовал его, вызвавЭлемент <a> через его идентификатор, и я жестко закодировал его - тогда он работает каждый раз: $('#1').attr('title', data);, но, конечно, мне нужно было бы использовать правильный идентификатор в зависимости от того, какая ссылка была нажата - но я не знаю, как получить его здесь.

Вот код test1.php файла, который называется

<?php
if (substr($_GET['title'], -2)=="on") {
 $result = "off";
}
else {
 $result = "on";
}
print "this is ".$result;
?>

Полагаю, я не до конца понимаю jQuery и просто упускаю что-то очень простое /Основной здесь.Заранее спасибо за просмотр.

j.

Ответы [ 3 ]

0 голосов
/ 23 января 2011

Вы должны поместить это:

$(this).attr('title', $.title);
$(this).closest('li').toggleClass('highlight');

в обратный вызов успеха, который в вашем случае равен

function(data) {
 $.title = data;
},

Кроме того, вы назначаете заголовок глобальному объекту jQuery, которыйкажется плохой идеей.Если вы хотите сохранить его в переменной, используйте локальную переменную:

var title = data;

вместо:

$.title = data;

Но в любом случае в этом случае вы должны иметь возможность назначитьзначение непосредственно в обратном вызове, как вы пытались раньше, безуспешно (потому что вы вызывали параметр data вне его области действия).

Вы заметили, что this больше не устанавливается для объекта jquery при выполнении обратного вызова.Чтобы исправить это, установите переменную явно за пределами обратного вызова, а затем обратитесь к ней внутри

Итак, поместив код в правильную область и присвоив этому явное значение, он должен выглядеть примерно так:

var $this = $(this);
$.get({
  ...
  function(data) {
    $this.attr('title', data);
    $this.closest('li').toggleClass('highlight');
  },
  ...
});

Проблема, с которой вы здесь столкнулись, заключается в том, что анонимная функция обратного вызова, которой $ .get () передает параметр data, не выполняется до после вызов ajax завершен.Таким образом, небольшая часть кода в объявлении вашей функции

function(data) { ... }

не запускается в том порядке, в котором она написана.Вот почему первый «A» в AJAX означает «асинхронный».Код после этой функции будет запускаться одновременно с другим кодом, поэтому ваша подсветка всегда работает.

Причина только для атрибута titleизменяется каждый другой раз, когда ваш успешный обратный вызов присваивает значение data глобально доступному объекту, $ объекту.Это означает, что вы можете получить доступ к этому значению вне области функции, в которой вы его присваиваете (в данном случае, обратный вызов).Тем не менее, вы можете получить к нему доступ только после того, как он был установлен!Поскольку он не устанавливается до тех пор, пока ответ AJAX не вернется с сервера, $ .title будет «неопределенным», пока это действие не будет завершено.Я предполагаю, что вызов AJAX завершился между вашим первым и вторым кликами.

0 голосов
/ 23 января 2011

Спасибо, но это не работает.Я пробовал все это раньше.Я пытался присвоить значение непосредственно в обратном вызове, но это не работает.Помещение toggleClass приводит к тому, что оно больше не работает.Я предполагаю, что это связано с тем, что $(this) больше не является правильным в обратном вызове.Если я назначил его непосредственно элементу через его идентификатор, он работает $('#1').attr('title', data);, но, очевидно, это не работает при наличии более одной ссылки для нажатия.

Позвольте мне попытаться объяснить.Это не работает:

$.get(
    "test1.php",
    { id: $(this).attr('id'), title: $(this).attr('title') },
    function(data) {
     $(this).attr('title', data);
    },

Это работает:

$.get(
    "test1.php",
    { id: $(this).attr('id'), title: $(this).attr('title') },
    function(data) {
     $('#1').attr('title', data);
    },

Кстати: помещение $(this).closest('li').toggleClass('highlight'); внутрь функции обратного вызова приводит к ошибке g.nodeName is undefined в Firebug.

Так что, может быть, подходить к этому по-другому: как лучше всего иметь возможность иметь идентификатор элемента доступным?Я предполагаю, что это какой-то базовый способ jQuery ... немного поиграв с ним, я пришел к этому, который работает - YAY

$(document).ready(function() {
    $('li div.toggle a').click(function() {
        var elementId = '#'+$(this).attr('id');
        $.get(
            "test1.php",
            { id: $(this).attr('id'), title: $(this).attr('title') },
            function(data) {
                $(elementId).attr('title', data);
            },
            "text");
        $(this).closest('li').toggleClass('highlight');
        return false;
    });
 });

Тем не менее - большое спасибо за ваши идеи.Они привели меня в правильном направлении.И, возможно, есть лучший или более элегантный способ сделать это.Если так, то мне было бы очень интересно!

0 голосов
/ 23 января 2011

проблема в том, что $ .get асинхронный.поэтому $ (this) .attr ('title', $ .title);выполняется сразу после запроса AJAX.но до ответа.

попробуйте установить заголовок в функции обратного вызова:

   $.get(
    "test1.php",
    { id: $(this).attr('id'), title: $(this).attr('title') },
    function(data) {

        $(this).attr('title', data);
    },
    "text");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...