2013-02-18 1 views
1

그래서 HTML로 자바 스크립트를 섞어도 머리가 나쁘다는 것을 이해합니다. 하지만이 코드를 볼 수 있습니다 (목록에서 항목을 제거하고 싶습니다)그들은 HTML의 자바 스크립트 코드가 나쁜 습관이라고 생각했는데, 어떻게 해결할 수 있습니까?

. 
. 
. 
<div>item1 <a href="#" onclick="return deleteThisItemById (1);">delete me</a><br /> 
<div>item4 <a href="#" onclick="return deleteThisItemById (4);">delete me</a><br /> 
<div>item5 <a href="#" onclick="return deleteThisItemById (5);">delete me</a><br /> 
. 
. 
. 

이 목록은 PHP에 의해 생성되었습니다. deleteThisItemById()는 외부 .js 파일에 있습니다. 여전히 나쁜가? 그렇다면 정식 솔루션은 무엇입니까? 원시 자바 스크립트와 마찬가지로 jQuery도 사용할 수 있습니다.

+1

나는 당신이 그곳에서 해낸 일에 어떤 문제가 있다고 생각하지 않습니다. 인라인 자바 스크립트는 실제로 아주 아주 나쁜 일이지만 머리 속에 외부 자바 스크립트가 필요한 것은 아무 문제가 없습니다. 하나는 jQuery 클릭 처리기를 추가하는 대신에 onclick에서 수행하는 경우를 만들 수 있습니다. 그렇더라도 자바 스크립트 및/또는 jquery는 여전히 어딘지 가져올 수 있습니까? –

+1

인라인 JS는 "매우 나쁨"이 아닙니다. 일부 시나리오에서는 제한적이지만 몇 년 동안 컨텐트와 프리젠 테이션 사이의 경계가 흐릿 해졌습니다. 할 수있을 때 최선의 방법을 사용하고, 할 수 없을 때 인생에 만족하십시오. – isherwood

+0

이벤트 처리기를 바인딩하는 다양한 방법을 배우려면 http://www.quirksmode.org/js/introevents.html을보십시오. –

답변

4
$(function() { 
    $('a#my_id1').click(function() { 
    var myId = $(this).attr('id'); 
    return deleteThisItemByID(myId); 
    }); 
}); 

<div> 
    item1 
    <a id="my_id1" href="#">delete me</a> 
</div> 

그런데 HTML이 잘못되었습니다. 부적절하게 div 태그를 중첩했습니다.

+1

'$ function()'에 구문 오류가 있습니다. 괄호가 없습니다 : P. 공평하게하기 위해 나는 OP에서 복사 할 때 닫는 div 태그를 생략했습니다. 나는 너의 포스트를 읽은 후에 바꿨다. – Klik

+0

감사. 구문이 고정되었습니다. – isherwood

+0

그건 괜찮지 만 .click() 함수에 매개 변수를 전달하는 방법은 무엇입니까? 나는 어떤 항목을 클릭했는지 아는 법을 의미 했습니까? –

4

간단한 ...

<div>item1 <a href="#" class='deleteMe'>delete me</a><br /></div> 
<div>item4 <a href="#" class='deleteMe'>delete me</a><br /></div> 
<div>item5 <a href="#" class='deleteMe'>delete me</a><br /></div> 

그런 다음

$('.deleteMe').on('click', function(event) { 
    $(this).remove(); 
}); 
jQuery를

와 요소를 대상으로 (그 하나 개의 항목 만있는 경우에만 ID를 사용하는) 당신은 클래스 또는 ID 을 제거 할 항목을 제공

참고 ... 전체 div를 삭제하려면이 선택 도구를 사용하십시오.

$('.deleteMe').closest('div').on('click', function(event) { 
    $(this).remove(); 
}); 
+0

실제로 그것은 ajax 요청이 될 것이므로 div 자체를 제거하면 해결책이 될 수 없습니다 :) –

+0

Ajax 요청이있을 경우 차이가 발생하지 않습니다. 이는 스레드가 코드를 통과 할 때 (성공 함수에 넣은 경우) 또는 jQuery 지연 객체 ('promise')를 사용하는 경우에만 변경됩니다. HTML 문서에 요소가있는 위치 또는 동적으로 삽입 한 위치에 따라 다릅니다. HTML이 당신이 내게 준 것 인 경우, 내 솔루션 모두 작동합니다. – Klik

2

이 작업을 수행하려면 addEventListener를 사용할 수 있습니다. 그리고 더 JS-코드가 HTML로 수 없습니다 : 그러나

var elems = document.querySelectorAll("div.removable"); 
for(var i=0;i<elems.length;i++){  
    elems[i].querySelector("a").addEventListener("click",function(e){ 
     var toRemove = this.parentNode; 
     var parent = toRemove.parentNode; 
     parent.removeChild(toRemove); 
    },false); 
} 

, 나는 div의 반복, 그래서 나는 이것에 대한 클래스를 추가 :

<div> 
    <div class="removable">item1 <a href="#">delete me</a></div><br /> 
    <div class="removable">item2 <a href="#">delete me</a></div><br /> 
    <div class="removable">item2 <a href="#">delete me</a></div><br /> 
</div> 

fiddle

에서보세요
1

나는 그 객체를 나타내는 dom 요소의 "data-"속성에 id와 비슷한 메타 데이터를 숨기려고한다. "

$('.posts').on('click', '.actions .delete', 
function() { 
    // which post should be deleted? 
    var $post = $(this).closest('.post'); 
    // remove the DOM element 
    $post.remove(); 
    // some sort of ajax operation 
    $.ajax({ 
    // url, dataType, etc 
    data: { post_id: $post.data('id') } 
    }); 
}); 

이 하나의 핸들러 모두에 적용됩니다 : 나는 보통의 .js 파일에 그런 비슷한 설정

<ul class="posts"> 
    <li class="post" data-post="####"> 
    <p>content...</p> 
    <ul class="actions"> 
     <li> 
     <a class="delete">delete</a> 
     </li> 
    </ul> 
    </li> 
</ul> 

를 사용합니다이 경우

는 페이지 하단에 포함 .action "요소를 주 목록에 추가합니다. 즉, ajax를 사용하여 목록을 수정하거나 시간을 추가하는 로더 또는 페이지 매김을 추가하려는 경우 하나의 이벤트 핸들러가 여전히 훌륭하게 작동합니다.

+0

아하! 그러나 "stranger"속성을 전달하면 잘못된 HTML 결과가됩니다. –

+1

data-xxx 속성은 HTML5 doctype을 사용할 때 유효합니다. –

관련 문제