2011-01-23 4 views
0

여기에서 발견 된 것들을 시도했지만 붙어있는 것처럼 보입니다. 여기에 내가하고 싶은 작업은 다음과 같습니다 링크를 클릭 부모 요소 클래스 jQuery ajax.get을 통해 title 속성을 변경하십시오.

  • 전환

    1. 응답
    에 제목을 링크의 ID와 제목 GET을 통해 아약스 요청을 보내고 변경해야

    # 1을 알아 냈고 # 2에서 AJAX 요청을 보내고 (호출 된 파일이 수행해야하는 모든 작업을 수행하고 응답도 좋습니다) 제목에 응답을 "첨부"하는 데 어려움을 겪고 있습니다.

    가 여기 내 HTML 코드

    내가 직접 $(this).attr('title', data);를 사용하는 대신 $.title = data;의 노력
    <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> 
    

    하지만 문제가 해결되지 않습니다 - 내 생각은 스크립트에서 그 단계에서 $(this)<a> 태그되지 않는 것입니다, 적절한 <a> 태그를 "다르게"선택하는 방법을 이해하는 데 충분한 jQuery를 알지 못합니다. 어쨌든, 이상한 것은 그것이 이런 식으로 작동한다는 것입니다 - 그러나 단지 다른 모든 시간!

    내가 다음 해당 ID를 통해 <a> 요소를 호출하여 시도하고 나는 그것을 하드 코딩 ... 그래서 클릭는 클래스가 아닌 제목은 변경 다음 클릭는 다시 이제 제목 클래스를 변경 - 그때마다 작동합니다 : $('#1').attr('title', data);하지만 물론 클릭 한 링크에 따라 올바른 ID를 사용해야합니다 -하지만 여기 그것을 얻는 방법을 모르겠습니다. 여기

    내가 완벽하지 jQuery를 이해하고 난 그냥 여기에 기본 매우 간단한 무언가를/누락 것을

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

    내 생각 호출되는 파일의 test1.php 코드입니다. 찾고있는 것에 미리 감사드립니다.

    j.

  • 답변

    0

    문제는 $ .get이 비동기입니다. 그래서 $ (this) .attr ('title', $ .title); ajax 요청 직후에 실행됩니다. 그러나 응답 전에. 귀하의 경우

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

    입니다 성공 콜백, 내부

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

    :이를 넣어야 할

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

    : 콜백 함수의 제목을 설정

    시도 또한 title을 전역 jQuery 객체에 할당하는 것은 좋지 않은 생각입니다.

    var title = data; 
    

    대신 :

    $.title = data; 
    

    그러나 어떤 경우에 당신이이 경우에 직접 값을 할당 할 수 있어야 당신이 변수에 저장하는 경우, 로컬 변수를 사용 콜백 (이전에 시도한 것처럼) (범위 외의 data 매개 변수를 호출했기 때문에) 실패했습니다.

    콜백이 실행될 때 this이 더 이상 jquery 객체로 설정되지 않는다고하셨습니다. 이 문제를 해결하려면 명시 적으로 콜백 외부에서 변수를 설정 한 다음 내부에서 참조하십시오.

    코드를 올바른 범위에두고 명시 적 값에 할당하면 코드는

    과 같이 표시됩니다.
    var $this = $(this); 
    $.get({ 
        ... 
        function(data) { 
        $this.attr('title', data); 
        $this.closest('li').toggleClass('highlight'); 
        }, 
        ... 
    }); 
    

    은에 익명 '콜백'기능 $ 갔지()가 data 매개 변수를 전달하고 있는지 당신이 여기에서 발생하는 문제는, AJAX 호출이 완료 후 때까지 실행되지 않습니다. 따라서 함수 선언 안에있는 약간의 코드는

    function(data) { ... } 
    

    으로 작성된 순서대로 실행되지 않습니다. 이것이 바로 AJAX의 첫 번째 'A'가 '비동기'를 나타내는 이유입니다. 인 경우이 다른 코드와 동시에 실행되기 때문에 강조가 항상 작동합니다.

    제목 속성 이유

    는 모든 다른 시간을 변경, 당신의 성공 콜백은, 전 세계적으로 접근 객체에 $ 객체를 data의 값을 할당된다는 점이다. 즉, 함수의 범위 밖에서이 값에 액세스 할 수 있습니다 (이 경우 콜백). 그러나 일단 설정되면 액세스 할 수 있습니다! AJAX 응답이 서버에서 돌아올 때까지 설정되지 않으므로 $ .title은 해당 작업이 완료 될 때까지 '정의되지 않음'이됩니다. 내 생각 엔 AJAX 호출이 첫 번째 및 두 번째 클릭 사이에 완료된 것입니다.

    +0

    Andy는 본질적으로 동일한 단어를 더 적은 단어로 제안합니다. 그는 title 속성을 변경하는 코드를 콜백 함수로 옮긴다. 강조 표시 비즈니스를 동기 코드에 남겨 둘지 또는 성공 콜백으로 옮길 지 여부는 실행시기에 따라 다릅니다. – alegscogs

    0

    감사하지만 작동하지 않습니다. 나는이 모든 것을 전에 시도했다. 콜백에서 값을 직접 할당하려고 시도했지만 작동하지 않습니다. toggleClass을 넣으면 더 이상 작동하지 않습니다. 내 생각 엔 $(this)이 콜백에서 더 이상 정확하지 않다는 것입니다. ID를 통해 요소에 직접 할당 한 경우 $('#1').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 오류가 발생

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

    이 작업을 수행합니다.

    그래서 다르게 접근 할 수 있습니다. 가장 좋은 방법은 요소의 ID를 사용할 수있게하려면 어떻게해야할까요? 나는 그것이 몇 가지 기본적인 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

    $ (이) 문제를 간과해서 죄송합니다. 위의 수정 된 대답을 확인하십시오 : 변수 $ (this)에 $ (this)를 저장 한 다음 콜백 함수 내에서 호출 할 수 있습니다. 해결 방법을 찾은 것을 축하하고 프로젝트에 행운을 보냅니다. – alegscogs

    관련 문제