프로그래밍 방식으로 HTML SELECT에 드롭 다운을 지시하는 방법 (예 : 마우스 오버로 인해)


106

프로그래밍 방식으로 HTML select에 드롭 다운을 지시 하는 방법 (예 : 마우스 오버로 인해)


6
<select>사람들이 특정 방식으로 작동 할 것으로 기대하고 다른 플랫폼 (예 : 모바일)의 사람들이 귀하의 사이트를 사용하는 것을 막을 수 있으므로 default의 동작을 망치지 않는 것이 좋습니다 .
Brian Donovan

1
@BrianDonovan 그것은 당신이 그것에 대해 약간의 처리를 추가 할 수없는 것 같지 않습니다.
Morg.

@shasikanth : 당신의 바이올린은 크롬에서 파이어 폭스 37 NR에 둘 다 작동하지 않습니다
rubo77

좋아, 나는 바이올린이 이전에 작동했다고 생각합니다. 어쨌든 여기에서 내 댓글을 삭제할 것입니다.
shasi kanth 2015

@BrianDonovan 사실, 모바일은 이것의 좋은 사용 사례입니다. 프로그래밍 방식으로 선택을 생성하고 옵션이 자동으로 팝업되도록합니다.
마이클

답변:


16

HTML 선택 태그로는이 작업을 수행 할 수 없지만 JavaScript HTML로 수행 할 수 있습니다 . 이를 수행하는 기존의 다양한 컨트롤이 있습니다. 예를 들어 SO "관심 / 무시 태그"항목에 첨부 된 "제안"목록 또는 이메일 주소에 대한 Gmail 조회 등이 있습니다.

이 기능을 제공하는 JavaScript + HTML 컨트롤이 많이 있습니다. 아이디어에 대한 자동 완성 컨트롤을 찾으십시오.

자동 완성 컨트롤은이 링크를 참조하십시오 ... http://ajaxcontroltoolkit.codeplex.com/


6
이것은 매우 수치스러운 일입니다. 모바일 브라우저는 OS 별 스크롤 목록을 제공하고 자동으로 팝업되도록해야합니다.
마이클

120

다른 사람들이 그렇지 않다고 말하는 모든 곳에서도 HTML + Javascript로 실제로 가능했지만 나중에 더 이상 사용되지 않으며 지금은 작동하지 않습니다.

그러나 이것은 Chrome에서만 작동했습니다. 관심이 있으시면 더 읽어보십시오.


에 따르면 HTML5 절 3.2.5.1.7에 대한 W3C 작업 초안. 인터랙티브 콘텐츠 :

HTML의 특정 요소에는 활성화 동작이 있으므로 사용자가 활성화 할 수 있습니다. 이렇게하면 활성화 메커니즘 [...] 따라 일련의 이벤트가 트리거됩니다 ( 예 : 키보드 또는 음성 입력 사용 또는 마우스 클릭) .

사용자가 클릭하는 것 이외의 방식으로 정의 된 활성화 동작으로 요소를 트리거하는 경우 상호 작용 이벤트의 기본 동작은 요소에서 합성 클릭 활성화 단계 를 실행하는 것이어야합니다 .

<select>인터랙티브 콘텐츠이기 때문에 <option>s 를 프로그래밍 방식으로 표시 할 수 있다고 믿었습니다 . 몇 시간 동안 놀다가 사용 document.createEvent()하고 .dispatchEvent()작동 한다는 것을 발견했습니다 .

즉, 데모 시간입니다. 다음은 작동하는 Fiddle입니다.


HTML :

<select id="dropdown">
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>
<br>
<button id="fire" type="button" onclick="runThis()">Show dropdown items</button>​

자바 스크립트 :

// <select> element displays its options on mousedown, not click.
showDropdown = function (element) {
    var event;
    event = document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown', true, true, window);
    element.dispatchEvent(event);
};

// This isn't magic.
window.runThis = function () { 
    var dropdown = document.getElementById('dropdown');
    showDropdown(dropdown);
};

누구든지 Chrome이 아닌 동일한 작업을 수행하는 방법을 찾으면 이 바이올린을 자유롭게 수정하십시오 .


2
감사합니다! Chrome에서 IE의 ALT + DOWN ARROW 동작을 정확하게 에뮬레이션해야했습니다.
J Bryan Price

3
이것에 대한 당신의 현상금에 추가 할 수 있으면 좋겠습니다. 정말 고맙습니다.
Adam Tuttle 2013

7
작동하지 않음 : IE10, FF 24. 에 작품 : Chrome 30, Safari 6.0.5,Opera 16
hitautodestruct

2
그것도 안드로이드 4.4.2에 일을하지 않는 @AdamTuttle
미르코


47

Xavier Ho의 답변은 현재 대부분의 브라우저에서 문제를 해결하는 방법을 다루고 있습니다. 그러나 더 이상 JavaScript로 이벤트를 '파견 / 수정하지 않는'것이 좋습니다 . ( mousedown이 경우 처럼 )

버전 53 이상부터 Google 크롬 은 신뢰할 수없는 이벤트에 대해 기본 작업을 수행하지 않습니다 . 스크립트에 의해 생성 또는 수정되거나 dispatchEvent메소드 를 통해 전달되는 이벤트와 같은 . 이 변경 사항은 이미 작업을 수행하지 않는 것으로 생각되는 Firefox 및 IE에 맞추기위한 것입니다.

테스트 목적으로 Fiddle 은 Xavier의 답변이 Chrome 53 이상에서 작동하지 않습니다. (나는 FF와 IE를 테스트하지 않습니다).

참조 링크 :

https://www.chromestatus.com/features/5718803933560832 https://www.chromestatus.com/features/6461137440735232

그리고 initMouseEvent도 더 이상 사용되지 않습니다.


MouseEvents를 사용하여 수행 할 수 있습니까? developer.mozilla.org/en-US/docs/Web/API/MouseEvent
샤말 페레라

나는 그렇게 생각하지 않는다. 뭐 해봤 어?
Asim KT

28

이것은 내가 얻을 수있는 가장 가까운 것입니다. onmouseover 요소의 크기를 변경하고 onmouseout 크기를 복원합니다.

       <select onMouseOut="this.size=1;" onMouseOver="this.size=this.length;">
        <option>1</option>
        <option>2</option>
        <option>3</option>
        <option>4</option>
        <option>5</option>
      </select>


13
또는 <SELECT onMouseOut = "this.size = 1;" onMouseOver = "this.size = this.length;"> ... </ SELECT>
RealHowTo

1
또한 선택이 이루어지면 메뉴가 축소되도록 onchange = "this.size = 1"을 추가해야합니다. 요소의 CSS 규칙도 구성해야합니다.
gm2008

작동하는 것 같습니다. 선택 너비가 축소되면 마우스 아웃 이벤트가 발생하여 선택을 원래 너비로 재설정합니다. 이것은 발작 효과를 유발합니다. 고정 너비를 설정하면 문제가 해결되는 것 같습니다. 항목이 몇 개 이상이면 목록이보기를지나 확장됩니다.
1.21 기가 와트

16

나는이 같은 문제를 가지고 있으며 이것이 html과 css를 사용하여 해결하기 위해 찾은 쉬운 방법입니다.

select{
  opacity: 0;
  position: absolute;
}
<select>
  <option>option 1</option>
  <option>option 2</option>
  <option>option 3</option>
</select>
<button>click</button>


2
이 접근 방식을 본지 오래되었고 내가 찾고자하는 참고 자료입니다. 트리거 할 숨겨진 선택의 크기 (버튼, img, div 등)와 일치하는 추가 CSS를 사용하면 더 좋습니다. 1) 클릭 가능한 영역이 트리거를 채우도록합니다. 2) 메뉴가 트리거 바로 아래에 열립니다. 참고 : 클릭 가능한 영역이 일부 레이아웃에서 최상위 요소가되도록 Z- 색인을 추가해야 할 수도 있습니다.
Mavelo

그러나 사용자가 페이지를 아래로 스크롤하면 그에 따라 버튼이 이동하지만 선택 항목은 동일한 위치에 유지됩니다. 예상과는 다릅니다. 이것에 대한 해결책이 있습니까?
데이비드 한 portabella

완벽한 솔루션. 그러나 더 나은 어쩌면 버튼을 감싸고 같은 사업부에 선택 <div style='position:relative'><select> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> <button>click</button></div>@DavidPortabella
무하 캔 TONBUL

8

Chrome에서는 더 이상 불가능하다고 생각합니다.

크롬 버전 53은 Asim K T가 언급 한대로이 기능을 비활성화하는 것 같습니다.

사양에 따르면 http://www.w3.org/TR/DOM-Level-3-Events/#trusted-events

신뢰할 수있는 이벤트는 기본 작업을 실행하지 않아야합니다 (클릭 이벤트 제외).

그러나 그들은 webview에서 그것을 활성화했지만 이것을 테스트하지는 않았습니다.

일부 웹뷰는 내부에서 fastclick을 사용하고 있으며 파손 위험으로 인해 신뢰할 수없는 경우에도 마우스 다운을 허용 할 것입니다.

그리고이 토론 에서 개발자가 프로그래밍 방식으로 드롭 다운을 열 수 있도록하는 아이디어는 포기되었습니다.


7

누군가 여전히 이것을 찾고 있다면 :

<select id="dropdown">
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>
<br>
<button id="fire" type="button" >Show dropdown items</button>

자바 스크립트 :

var is_visible=false; 

$(document).ready(function(){

    $('#fire').click(function (e) { 
    var element = document.getElementById('dropdown');


    if(is_visible){is_visible=false; return;}
    is_visible = true;

    var event;
    event = document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown', true, true, window);
    element.dispatchEvent(event);

    /* can be added for i.e. compatiblity.
      optionsSelect.focus();
       var WshShell = new ActiveXObject("WScript.Shell");
       WshShell.SendKeys("%{DOWN}");
    */
    e.stopPropagation();
    return false;
});


$(document).click(function(){is_visible=false; });
});

최신 정보:

이 문제에 대한 완벽한 해결책이 없을 때까지 하나, 그러나이 시나리오를 피할 수 있습니다. 왜 이것을하고 싶은가. 모바일 장치 용 플러그인을 선택하기 위해 몇 달 전에 솔루션을 찾고있었습니다.

https://github.com/HemantNegi/jquery.sumoselect

마지막으로 사용자와 직접 상호 작용할 수 있도록 사용자 정의 div (또는 다른 요소)를 투명한 선택 요소로 마스킹했습니다.


1
github.com/HemantNegi/jquery.sumoselect 와 같은 플러그인 은 실제로 기본 컨트롤보다 더 좋아 보이는 유일한 크로스 브라우저 솔루션입니다.
Justin

iniMouseEvent작동하는 것 같지만 왜 작동 $(select).trigger('mousedown')하지 않습니까?
coding_idiot 2015-08-09

3

내가 찾은 가장 좋은 방법은 다음과 같습니다. 참고 Windows의 IE에서만 작동하며 셸에 액세스하기 때문에 웹이 보안 영역에 있어야합니다. 트릭은 ALT- 아래쪽 화살표가 선택 드롭 다운을 여는 바로 가기 키라는 것입니다.

<button id="optionsButton" style="position:absolute;top:10px;left:10px;height:22px;width:100px;z-index:10" onclick="doClick()">OPTIONS</button>
<select id="optionsSelect" style="position:absolute;top:10px;left:10px;height:20px;width:100px;z-index:9">
    <option>ABC</option>
    <option>DEF</option>
    <option>GHI</option>
    <option>JKL</option>
</select>
<script type="text/javascript">
   function doClick() {
       optionsSelect.focus();
       var WshShell = new ActiveXObject("WScript.Shell");
       WshShell.SendKeys("%{DOWN}");
   }
</script>

3
당신이하지 않으면 그것은 작동하지 않습니다 .
Knu

1
@Knu Internet Explorer는 요소의 ID를 요소에 대한 참조로 전역 범위에 자동으로 추가합니다.
user2428118 2014

@KlasMellbourn 아마. 그들은 이제 브라우저의 호환성을 높이기 위해 노력하고 있습니다. 언급 된 "크기"솔루션을 사용하십시오.
sproketboy 2014-06-05

2

당신이 원할 때 한 가지는 불가능하다고 생각하지 마십시오.

남자가 만든이 확장 JS 기능을 사용하십시오.

http://code.google.com/p/expandselect/

이 JS를 포함하고 다음과 같이 매개 변수를 선택 ID로 전달하는 호출하십시오.

ExpandSelect(MySelect)

2
명확하게 말하면 JS는 a 가 드롭 다운 되지 않습니다<SELECT> . "브라우저는 순수 자바 스크립트에서 <select> 확장을 허용하지 않으므로 해당 컨트롤은 마우스를 사용하여 직접 클릭해야만 확장 할 수 있습니다."라고 명시 적으로 명시되어 있습니다. 그래서 이다 "불가능"! 대신 JS는 "한 번에 여러 옵션이 표시되는 다른 선택을 생성하여 확장 된 <select> 컨트롤을 모방합니다 ..."라고 말합니다. 이는 상당히 다르며 사용 사례에 적합 할 수도 있고 그렇지 않을 수도 있습니다 ....
JonBrave

1

내가 틀렸을 수도 있지만 기본 선택 상자에서 가능하다고 생각하지 않습니다. 원하는 결과를 얻는 JS 및 CSS로 무언가를 할 수 있지만 (내 지식으로는) 바닐라 SELECT가 아닙니다.


0

"HTML 선택"을 여는 것은이 질문에 언급 된 몇 가지 해결 방법과 유사한 해결 방법을 통해 가능합니다. 그러나 이렇게하는 더 깨끗한 방법은 "select2"또는 "chosen"과 같은 선택 라이브러리를 프로젝트에 추가하는 것입니다. 예를 들어 select2를 프로그래밍 방식으로 여는 것은 다음과 같이 쉽습니다.

$('#target-select').select2('open');

-2

이것은 정확히 당신이 요구 한 것은 아니지만 단순함 때문에이 솔루션을 좋아합니다. 드롭 다운을 시작하려는 대부분의 경우 사용자가 실제로 선택했는지 확인하고 있기 때문입니다. 드롭 다운의 크기를 변경하고 초점을 맞추면 건너 뛴 내용이 멋지게 강조됩니다.

$('#cboSomething')[0].size = 3;
$('#cboSomething')[0].focus();

"최악의"방법이 아니기 때문에 왜 반대표를 받았는지 모르겠습니다. 나는 주변 요소의 레이아웃을 변경하기 때문에 이것을 피할 것입니다. @CMS의 솔루션은 컨트롤의 포커스 / 블러 이벤트로 더 쉽게 이해할 수 있다고 생각합니다.
Mavelo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.