[javascript] 일부 HTML 태그에 대한 임의의 데이터를 저장하는 방법

자바 스크립트가 제공하는 상호 작용이있는 페이지를 만들고 있습니다. 예를 들어 AJAX 요청을 보내 기사의 내용을 가져온 다음 해당 데이터를 div에 표시하는 링크입니다. 분명히이 예에서, 기사의 ID 인 여분의 정보를 저장하려면 각 링크가 필요합니다. 내가 처리 한 방식은 href 링크에 해당 정보를 넣는 것입니다.

<a class="article" href="#5">

그런 다음 jQuery를 사용하여 a.article 요소를 찾고 적절한 이벤트 핸들러를 연결합니다. (여기서 유용성이나 의미에 매달리지 마십시오. 단지 예일뿐입니다)

어쨌든,이 방법은 효과가 있지만 약간 냄새가 나고 전혀 확장 할 수 없습니다 (클릭 기능에 둘 이상의 매개 변수가있는 경우 어떻게됩니까? 그러한 매개 변수 중 일부가 선택적인 경우 어떻게됩니까?)

즉각적인 대답은 요소에 속성을 사용하는 것이 었습니다. 내 말은, 그것이 그들이 원하는 것입니까? (거의).

<a articleid="5" href="link/for/non-js-users.html">

에서 내 최근 질문 이 방법이 유효하면 내가 물었고, 그 다음에 아니, 유효하거나 신뢰성이 아니다, (나는 안) 내 자신의 DTD를 정의하지의 짧은 밝혀졌습니다. 일반적인 반응은 데이터를 class속성 에 넣는 것이 었지만 (내 잘못 선택한 예일 수도 있지만) 나에게는 더 냄새가납니다. 예, 기술적으로 유효하지만 훌륭한 솔루션은 아닙니다.

내가 과거에 사용했던 또 다른 방법은 실제로 일부 JS를 생성하고 <script>태그 의 페이지에 삽입 하여 객체와 연결할 구조체를 만드는 것입니다.

var myData = {
    link0 : {
        articleId : 5,
        target : '#showMessage'
        // etc...
    },
    link1 : {
        articleId : 13
    }
};

<a href="..." id="link0">

그러나 이것은 유지하기 위해 엉덩이에 진짜 고통이 될 수 있으며 일반적으로 매우 지저분합니다.

따라서 질문에 도달하기 위해 HTML 태그에 대한 임의의 정보 조각을 어떻게 저장 합니까?



답변

어떤 버전의 HTML을 사용하고 있습니까?

HTML 5, 가지고 완전히 유효 데이터 -로 시작 속성 정의를 , 예를 들어,

<div data-internalid="1337"></div>

XHTML에서 이것은 실제로 유효하지 않습니다. XHTML 1.1 모드 인 경우 브라우저에서 이에 대해 불평하지만 1.0 모드에서는 대부분의 브라우저가 자동으로 무시합니다.

내가 당신이라면, 스크립트 기반 접근법을 따르겠습니다. 서버 측에서 자동으로 생성하여 유지 관리에 어려움을 겪지 않도록 할 수 있습니다.


답변

jQuery를 이미 사용하고 있다면 jQuery를 사용하여 dom 요소에 임의의 데이터를 저장하는 데 권장되는 방법 인 “data”방법을 사용해야합니다.

무언가를 저장하려면 :

$('#myElId').data('nameYourData', { foo: 'bar' });

데이터를 검색하려면

var myData = $('#myElId').data('nameYourData');

그게 전부입니다.하지만 자세한 정보 / 예제 는 jQuery 설명서 를 참조하십시오.


답변

또 다른 방법으로, 나는 개인적으로 이것을 사용하지 않지만 작동합니다 (eval ()이 위험하기 때문에 JSON이 유효한지 확인하십시오).

<a class="article" href="link/for/non-js-users.html">
    <span style="display: none;">{"id": 1, "title":"Something"}</span>
    Text of Link
</a>

// javascript
var article = document.getElementsByClassName("article")[0];
var data = eval(article.childNodes[0].innerHTML);


답변

임의의 속성은 유효하지 않지만 최신 브라우저에서는 완벽하게 신뢰할 수 있습니다. 자바 스크립트를 통해 속성을 설정하는 경우 유효성 검사에 대해 걱정할 필요가 없습니다.

대안은 자바 스크립트에서 속성을 설정하는 것입니다. jQuery에는 그 목적을위한 유용한 유틸리티 메소드가 있거나 직접 롤백 할 수 있습니다.


답변

가능한 모든 브라우저에서 작동하는 해킹은 다음과 같이 공개 클래스를 사용하는 것입니다. <a class='data\_articleid\_5' href="link/for/non-js-users.html>;

이것은 순수 주의자들에게 그다지 우아하지는 않지만 보편적으로 지원되고 표준을 준수하며 조작하기가 매우 쉽습니다. 실제로 가장 좋은 방법처럼 보입니다. 이 경우 serialize, 수정 , 복사 태그를, 또는 다른 거의 아무것도 할,data 것이다 유지 부착 복사 등

유일한 문제는 직렬화수없는 객체를 그런 식으로 저장할 수 없으며 실제로 거대한 것을 넣으면 한계가있을 수 있다는 것입니다.

두 번째 방법은 다음과 같은 가짜 속성 을 사용하는 것입니다.<a articleid='5' href="link/for/non-js-users.html">

이것은 더 우아하지만 표준을 위반하며 지원에 대해 100 % 확신하지 못합니다. 많은 브라우저가 완전히 지원 JS하지만 IE6는 액세스를 지원 하지만 CSS selectors(여기서는 중요하지 않음) 액세스를 지원한다고 생각합니다 . 아마도 일부 브라우저가 완전히 혼란 스러울 수 있으므로 확인해야합니다.

직렬화 및 역 직렬화와 같은 재미있는 작업을 수행하는 것이 훨씬 더 위험합니다.

태그를 복사하려고 할 때를 제외하고는 ids순수 JS해시를 사용하는 것이 대부분 작동합니다. 이있는 경우 tag <a href="..." id="link0">표준 JS방법을 통해 복사 한 다음 data하나의 사본에 첨부 된 파일을 수정하려고 하면 다른 사본이 수정됩니다.

를 복사하지 않거나 읽기 전용 데이터를 tag사용 하는 경우 문제가되지 않습니다 . 를 복사 하고 수정 한 경우 수동으로 처리해야합니다.tag


답변

jquery를 사용하여

저장 : $('#element_id').data('extra_tag', 'extra_info');

검색 : $('#element_id').data('extra_tag');


답변

현재 jQuery를 사용하고 있지만 onclick 핸들러를 인라인으로 정의하면 어떻게됩니까? 그럼 당신은 할 수 있습니다 :

 <a href='/link/for/non-js-users.htm' onclick='loadContent(5);return false;'>
     Article 5</a>