자바 스크립트, HTML 및 CSS 간의 긴밀한 결합 :보다 현대적인 접근 방식?


29

Javascript가 특정 선택기에 바인딩되어 요소를 찾고 데이터를 저장하며 이벤트를 수신하는 것이 일반적입니다. 스타일링에 이와 동일한 선택기가 사용되는 것도 일반적입니다.

jQuery (및 선택기 엔진 Sizzle)는 CSS 유형 구문으로 요소를 참조하여이를 지원하고 승격시킵니다. 따라서이 기술은 프로젝트를 구축 할 때 '학습'(또는 리팩토링)하기가 특히 어렵습니다.

나는 이것이 HTML 및 Javascript 개발의 역사의 결과이며 브라우저가 이러한 종류의 커플 링을 효율적으로 소비 / 구문 분석 / 렌더링하도록 구축되었다는 것을 이해했습니다. 그러나 웹 사이트가 점점 복잡 해짐에 따라 이러한 현실은 이러한 개별 계층을 구성하고 유지 관리하는 데 어려움을 초래할 수 있습니다.

내 질문은 : 현대 웹 사이트에서 이것을 피할 수 있습니까?

프론트 엔드 개발에 익숙하지 않고 '올바른 방법'을 배우고 싶다면 처음부터 그러한 의존성을 분리하고 피하는 것이 좋습니다. 이것은 더 분리 된 구조를 장려하는 라이브러리를 선호하여 jQuery를 피하는 것을 의미합니까?


1
그런 일은 어떻게 작동합니까? 예를 들어, 어떤 식 으로든 해당 컨트롤을 실제로 건드 리거나 지식이 없어도 페이지에서 컨트롤을 어떻게 비활성화합니까? (이것은 당신이 디커플링함으로써 의미에 대해 더 구체적으로 설명해야한다고 말하는 작은 방법입니다.
Robert Harvey

2
html, css 및 js를 분리 할 때 가장 중요한 것은 클래스 선택기를 사용하는 것입니다. 이것은 oocss 및 BEM과 같은 방법론의 핵심 개념입니다.
앙 빌라

React 또는 웹 구성 요소를 배우면 더 이상 JS의 선택기를 신경 쓰지 않아도됩니다.
Andy

답변:


35

그것을 피할 방법이 없습니다. 그들은 서로 상호 작용하기 때문에 연결됩니다. 자바 스크립트가 어떤 종류의 DOM 조작을하려는 경우 DOM을 참조 할 방법이 필요합니다.

그것에 대한 다양한 규칙이 있습니다.

레벨 2 DOM API는 getElementById, getElementByTagName 및 getElementsByName 메소드를 제공합니다. 오늘날까지 이것들은 모든 종류의 DOM 순회 작업의 핵심입니다. 다른 모든 더 멋진 jQuery 선택기는 이러한 조합을 결정하거나 각 DOM 노드를 순회합니다 (이것은 getByClassName을 수행하는 방법이었습니다).

다른 바로 가기가 없습니다. 자바 스크립트는 무엇을하고 어디에서해야하는지 알아야합니다. 일반적으로 요소에 스크립팅에만 관련된 id 또는 클래스가있는 경우 많은 사람들이 접두사 js-또는 다른 명백한 플래그를 접두어로 사용합니다 .

또 다른 최신 규칙은 데이터 속성 선택입니다.

<ul data-myapp-sortable="true">

jQuery('[data-myapp-sortable]').makeSortable();

데이터 속성은 일반적으로 스크립팅 목적으로 사용되며이를 사용하여 선택하는 것이 합리적입니다. 단점은 getElementById ()를 사용하는 것보다 느리다는 것입니다.

또 다른 방법은 angularJS에서 사용하는 방법으로 뷰 모델을 만듭니다. 이 규칙에서 모든 종류의 스크립팅 기능은 특별히 지정된 속성 등으로 지정됩니다 ng-disabled ng-href. 자바 스크립트에 선택기를 추가하지 않습니다. HTML 문서는 스크립팅 된 내용과 방법에 대한 주요 권한이되며 Javascript는 추상적으로 작동합니다. 좋은 접근 방법이지만 이전 방법보다 학습 곡선이 더 높습니다. 그리고 다시 성능을 고려해야합니다.

그러나 대화 형 HTML과 자바 스크립트를 작성할 수 있다고 생각하지 마십시오. 어쨌든 두 부분 모두 상대방에 대해 알지 못합니다. 참조를 종속성으로 제한하는 방법에 대해 자세히 설명합니다.


2
훌륭한 답변, +1 타이트한 커플 링을 피하기위한 메커니즘으로 데이터 속성을 언급 한 경우
Fergus In London

3
데이터 속성은 만병 통치약이 아닙니다. 그들은 요즘 매우 인기가 있으며 사람들은 부엌 싱크대를 제외한 모든 것을 넣습니다. 많은 프레임 워크 (예 : jQuery UI)가 광범위하게 사용합니다. 문제를 피하려면 네임 스페이스 및 기타 규칙을 엄격히 준수해야합니다. JS에서 HTML을 분리하는 데 도움이되지만 디버깅이 더 쉬워지는 것은 아닙니다.
mastaBlasta

클래스, ID 및 데이터 속성을 후크 및 상태 플래그로 사용하여 재발 명해야하는 이유를 이해하지 못했습니다. 이러한 관점에서 모든 Angular는 성능의 저하이며 널리 알려진 / 이해 된 컨벤션을 자신의 속성과 태그를 발명하여 "앵귤러 방식"을 수행하는 방법을 이해해야하는 새로운 컨벤션으로 대체했습니다. 거기에는 큰 학습 곡선이 없습니다. 완벽하게 합리적이고 일반적으로 알려진 컨벤션과 완전히 불필요한 IMO에 반하여 느리게 진행됩니다.
Erik Reppen

9

당신이 얻는 상호 작용을 기꺼이 포기하고 싶다면 Javascript를 완전히 피할 수 있습니다. ASP.NET MVC와 같은 프레임 워크는 HTML, CSS 및 SUBMIT 단추 만 포함 된 페이지를 제공하는 데 매우 적합합니다.

승인. 어쩌면 그것은 약간 극단적 일 수 있습니다.

웹 애플리케이션의 디커플링은 이미 여러 수준에서 발생합니다. REST 애플리케이션을 사용하면 URL과 연관된 "웹 자원"의 관점에서 애플리케이션을 정의 할 수 있습니다. 뷰 모델을 사용하면 도메인 모델과 분리 된 UI에 데이터를 표시 할 수 있지만 데이터를 올바르게 표시해야하는 모양이 있습니다. 서비스 계층을 통해 한 UI를 다른 UI로 교체 할 수 있습니다.

역사적으로, 상호 작용 성과 커플 링 사이에는 항상 상충 관계가있었습니다. 웹 페이지가 대화 형 일수록 웹 애플리케이션과 더 밀접하게 연결됩니다. 그러나 웹 페이지의 상호 작용 논리는 웹 페이지 자체에 국한됩니다. 서버와의 연결은 POST 또는 AJAX를 통해 발생합니다. 따라서 브라우저와 서버간에 데이터 패킷이 전달되는 방식에주의를 기울이는 것 외에 Javascript 수준의 커플 링에 지나치게 신경 써야한다고 확신하지 않습니다.

가장 "현대적인"접근 방식 (즉, 금주의 특징)은 아마도 SPA 응용 프로그램 일 것입니다 .


나에게 극단적 인 소리가 들리지 않습니다. 자바 스크립트를 광범위하게 사용하는 많은 사이트는 자바 스크립트 없이는 사용할 수 없다는 점에서 실제로는 필요하지 않습니다. 그들의 개발자가 더 많은 단서를 가지고 있었을까요?
Michael Hampton

5

Martin Fowler는 이에 대한 한 가지 접근 방식을 Segregated DOM 으로 설명 합니다 . 여기서 DOM JavaScript를 페이지 로직 JavaScript와 분리합니다.

Application Logic <----> DOM Manipulation <----> DOM / HTML

1
+1 JavaScript <-> DOM 로직을 분리하는 것에 전적으로 동의합니다. 데이터 속성은 DOM과 관련이 없지만 외부 도구와 관련이 있기 때문에 데이터 속성을 좋아하지 않습니다. 더 깨끗한 접근법은 어떤 유형의 매핑을 갖는 것이라고 생각합니다. 예, 이것은 JS가 선택하는 일부 참조를 포함하는 DOM이 아닌 두 가지 측면 (예 : JS 함수 및 DOM 요소)에 대한 참조가있는 파일을 가지고 있음을 의미 할 수 있습니다 '). 그러나 신중하게 수행하면 유지 관리가 쉽고 재사용이 가능하며 데이터 속성보다 우려를 더 잘 분리 할 수 ​​있습니다.
awj

2

아니요, 클래스, 요소 및 ID 선택기를 클라이언트 측에서 사용하지 않아야합니다. CSS 선택기는 매우 성숙하고 잘 정립 된 도메인 언어이기 때문에이 구문이 사용됩니다. 공통 디자인을 사용하면 프로그램과 디자인간에 페이지의 공통 논리 모델을 훨씬 쉽게 공유 할 수 있습니다. 이는 매우 좋은 일입니다.

이 구문을 잘못 사용하고 끔찍하고 유지 관리 할 수없는 응용 프로그램을 만들 수는 있지만 언어 나 도구 집합에 관계없이 가능합니다.


2
실제로 클래스, 요소 및 ID 선택기를 여러 가지로 사용하지 말고 대신 [data-*]강력한 방식으로 사용할 수있는 사용자 지정 특성 선택기 를 사용하는 데 집중하십시오 .
zzzzBov

2
특히 선택기에 대해 가정하지 않아야하는 모듈 형 / 재사용 가능한 JS를 작성할 때 조언이 부족합니다. 이러한 시나리오에는 데이터 특성이 더 좋습니다.
Fergus In London

3
@zzzzBov-미세 최적화라는 것을 알고 있지만 ID 및 클래스 조회는 데이터 속성 조회보다 훨씬 빠릅니다. 그러나 그렇습니다. 다른 관심사를 처리하기 위해 다른 속성 세트를 사용하는 아이디어가 좋습니다.
Jimmy Breck-McKye

0

누군가는 dom에 대한 간접 및 캐시 계층을위한 jQuery 경로 관리자 인터페이스를 구축해야합니다.

pathMgr.register(name,selector [,isDynamic=false]);
pathMgr.get(name [,refresh]);

그때,

String.prototype.reg([isDynamic=false]);
String.prototype.get(name [,refresh]);

그래서,

// at init....
var pathMgr=new PathMgr();
'sidebar-links #sidebar a'.reg();// new registery of selector '#sidebar a' under name 'sidebar-links'
// more, more


// in code
'sidebar-links'.get().css(etc...);
//or
'sidebar-links'.addStyleRule({});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.