답변:
위의 답변 중 다수는 양식 요소에서만 작동합니다. 내용을 포함하여 DIV를 비활성화하는 간단한 방법은 마우스 상호 작용을 비활성화하는 것입니다. 예를 들면 다음과 같습니다.
$("#mydiv").addClass("disabledbutton");
CSS
.disabledbutton {
pointer-events: none;
opacity: 0.4;
}
JQuery와 같은 프레임 워크를 사용하여 다음과 같은 작업을 수행하십시오.
function toggleStatus() {
if ($('#toggleElement').is(':checked')) {
$('#idOfTheDIV :input').attr('disabled', true);
} else {
$('#idOfTheDIV :input').removeAttr('disabled');
}
}
jQuery 를 사용하여 Div 블록에서 입력 요소 비활성화 및 활성화 가 도움이 될 것입니다!
jQuery 1.6부터는 비활성화 .prop
대신 사용해야 합니다 .attr
.
난 그냥 요소를 활성화 및 비활성화하는이 확장 방법 을 언급 하고 싶었다 . 속성을 직접 추가하고 제거하는 것보다 훨씬 깨끗한 방법이라고 생각합니다.
그런 다음 간단하게 수행하십시오.
$("div *").disable();
다음은 div가 필요하지 않고 블록 요소 만 필요한 사람들을위한 빠른 의견입니다. HTML5 <fieldset disabled="disabled"></fieldset>
에서는 disabled 속성이 있습니다. 비활성화 된 필드 세트의 모든 양식 요소는 비활성화되어 있습니다.
이 간단한 CSS 문을 사용하여 이벤트를 비활성화 할 수 있습니다
#my-div {
pointer-events:none;
}
테스트 된 브라우저 : IE 9, Chrome, Firefox 및 jquery-1.7.1.min.js
$(document).ready(function () {
$('#chkDisableEnableElements').change(function () {
if ($('#chkDisableEnableElements').is(':checked')) {
enableElements($('#divDifferentElements').children());
}
else {
disableElements($('#divDifferentElements').children());
}
});
});
function disableElements(el) {
for (var i = 0; i < el.length; i++) {
el[i].disabled = true;
disableElements(el[i].children);
}
}
function enableElements(el) {
for (var i = 0; i < el.length; i++) {
el[i].disabled = false;
enableElements(el[i].children);
}
}
아시다시피 'disabled'속성을 사용하여 HTML 입력 컨트롤을 비활성화 할 수 있습니다. 입력 제어에 대해 'disabled'속성이 설정되면 해당 제어와 연관된 이벤트 핸들러가 호출되지 않습니다.
원하는 경우 div와 같은 'disabled'속성을 지원하지 않는 HTML 요소에 대해 위의 동작을 시뮬레이션해야합니다.
div가 있고 해당 div에서 클릭 또는 키 이벤트를 지원하려면 두 가지 작업을 수행해야합니다. 1) div를 비활성화하려면 disabled 속성을 평소와 같이 설정하십시오 ( 규칙) 2) div의 클릭 및 / 또는 키 처리기에서 div에 disabled 속성이 설정되어 있는지 확인하십시오. 그렇다면 클릭 또는 키 이벤트를 무시하십시오 (예 : 즉시 반환). disabled 속성이 설정되어 있지 않으면 div의 클릭 및 / 또는 키 이벤트 로직을 수행하십시오.
위의 단계는 브라우저와 무관합니다.
나는 몇 노트에 칩을 줄 것이라고 생각했다.
Cletus 기능의 개선 된 버전을 사용합니다.
$.fn.disable = function() {
return this.each(function() {
if (typeof this.disabled != "undefined") {
$(this).data('jquery.disabled', this.disabled);
this.disabled = true;
}
});
};
$.fn.enable = function() {
return this.each(function() {
if (typeof this.disabled != "undefined") {
this.disabled = $(this).data('jquery.disabled');
}
});
};
요소의 원래 'disabled'속성을 저장합니다.
$('#myDiv *').disable();
CSS pointer-events
속성만으로는 자식 요소가 스크롤되는 것을 비활성화하지 않으며 IE10에서는 지원되지 않으며 DIV 요소에서는 지원되지 않습니다 (SVG 만 해당).
http://caniuse.com/#feat=pointer-events
모든 브라우저에서 DIV의 내용을 비활성화합니다.
자바 스크립트 :
$("#myDiv")
.addClass("disable")
.click(function () {
return false;
});
CSS :
.disable {
opacity: 0.4;
}
// Disable scrolling on child elements
.disable div,
.disable textarea {
overflow: hidden;
}
IE10 이하를 제외한 모든 브라우저에서 DIV의 내용을 비활성화합니다.
자바 스크립트 :
$("#myDiv").addClass("disable");
CSS :
.disable {
// Note: pointer-events not supported by IE10 and under
pointer-events: none;
opacity: 0.4;
}
// Disable scrolling on child elements
.disable div,
.disable textarea {
overflow: hidden;
}
아래는 div를 마스킹하는보다 포괄적 인 솔루션입니다.
또한 hourglassOn과 hourglassOff가 포함되어있어 별도로 사용할 수 있습니다
// elemOrId - jquery element or element id, defaults to $('<body>')'
// settings.color defaults to 'transparent'
// settings.opacity defaults to 1
// settings.zIndex defaults to 2147483647
// if settings.hourglasss==true change cursor to hourglass over mask
function maskOn(elemOrId, settings) {
var elem=elemFromParam(elemOrId);
if (!elem) return;
var maskDiv=elem.data('maskDiv');
if (!maskDiv) {
maskDiv=$('<div style="position:fixed;display:inline"></div>');
$('body').append(maskDiv);
elem.data('maskDiv', maskDiv);
}
if (typeof settings==='undefined' || settings===null) settings={};
if (typeof settings.color==='undefined' || settings.color===null) settings.color='transparent';
if (typeof settings.opacity==='undefined' || settings.opacity===null) settings.opacity=1;
if (typeof settings.zIndex==='undefined' || settings.zIndex===null) settings.zIndex=2147483647;
if (typeof settings.hourglass==='undefined' || settings.hourglass===null) settings.hourglass=false;
// stretch maskdiv over elem
var offsetParent = elem.offsetParent();
var widthPercents=elem.outerWidth()*100/offsetParent.outerWidth()+'%';
var heightPercents=elem.outerHeight()*100/offsetParent.outerHeight()+'%';
maskDiv.width(widthPercents);
maskDiv.height(heightPercents);
maskDiv.offset($(elem).offset());
// set styles
maskDiv[0].style.backgroundColor = settings.color;
maskDiv[0].style.opacity = settings.opacity;
maskDiv[0].style.zIndex = settings.zIndex;
if (settings.hourglass) hourglassOn(maskDiv);
return maskDiv;
}
// elemOrId - jquery element or element id, defaults to $('<body>')'
function maskOff(elemOrId) {
var elem=elemFromParam(elemOrId);
if (!elem) return;
var maskDiv=elem.data('maskDiv');
if (!maskDiv) {
console.log('maskOff no mask !');
return;
}
elem.removeData('maskDiv');
maskDiv.remove();
}
// elemOrId - jquery element or element id, defaults to $('<body>')'
// if decendents is true also shows hourglass over decendents of elemOrId, defaults to true
function hourglassOn(elemOrId, decendents) {
var elem=elemFromParam(elemOrId);
if (!elem) return;
if (typeof decendents==='undefined' || decendents===null) decendents=true;
if ($('style:contains("hourGlass")').length < 1) $('<style>').text('.hourGlass { cursor: wait !important; }').appendTo('head');
if ($('style:contains("hourGlassWithDecendents")').length < 1) $('<style>').text('.hourGlassWithDecendents, .hourGlassWithDecendents * { cursor: wait !important; }').appendTo('head');
elem.addClass(decendents ? 'hourGlassWithDecendents' : 'hourGlass');
}
// elemOrId - jquery element or element id, defaults to $('<body>')'
function hourglassOff(elemOrId) {
var elem=elemFromParam(elemOrId);
if (!elem) return;
elem.removeClass('hourGlass');
elem.removeClass('hourGlassWithDecendents');
}
function elemFromParam(elemOrId) {
var elem;
if (typeof elemOrId==='undefined' || elemOrId===null)
elem=$('body');
else if (typeof elemOrId === 'string' || elemOrId instanceof String)
elem=$('#'+elemOrId);
else
elem=$(elemOrId);
if (!elem || elem.length===0) {
console.log('elemFromParam no element !');
return null;
}
return elem;
}
이를 통해 예를 들어 다음을 수행 할 수 있습니다.
maskOn(); // transparent page mask
maskOn(null, {color:'gray', opacity:0.8}); // gray page mask with opacity
maskOff(); // remove page mask
maskOn(div); // transparent div mask
maskOn(divId, {color:'gray', hourglass:true}); // gray div mask with hourglass
maskOff(div); // remove div mask
jsfiddle 참조
function disableItems(divSelector){
var disableInputs = $(divSelector).find(":input").not("[disabled]");
disableInputs.attr("data-reenable", true);
disableInputs.attr("disabled", true);
}
function reEnableItems(divSelector){
var reenableInputs = $(divSelector).find("[data-reenable]");
reenableInputs.removeAttr("disabled");
reenableInputs.removeAttr("data-reenable");
}
또는 CSS와 "비활성화 된"클래스를 사용하십시오.
참고 : disabled 속성을 사용하지 마십시오.
jQuery를 켜거나 끌 필요가 없습니다.
이것은 훨씬 쉽고 크로스 브라우저에서 작동합니다.
.disabled{
position: relative;
}
.disabled:after{
content: "";
position: absolute;
width: 100%;
height: inherit;
background-color: rgba(0,0,0,0.1);
top: 0;
left: 0;
right: 0;
bottom: 0;
}
그런 다음 페이지를 초기화하거나 단추를 전환 할 때 페이지를 켜거나 끌 수 있습니다
if(myDiv !== "can be edited"){
$('div').removeClass('disabled');
} else{
$('div').addClass('disabled');
}
jQuery의 또 다른 방법은 포함하는 DIV의 내부 높이, 내부 너비 및 위치를 가져와 동일한 크기 위에 투명하게 다른 DIV를 오버레이하는 것입니다. 이것은 입력이 아닌 컨테이너 내부의 모든 요소에서 작동합니다.
JS가 비활성화되어 있어도 DIV 입력 / 콘텐츠를 계속 사용할 수 있습니다. 위의 답변도 마찬가지입니다.
이 CSS 전용 / 노 스크립트 솔루션은 상호 작용을 방지하여 필드 세트 (또는 div 또는 기타 요소) 위에 오버레이를 추가합니다.
fieldset { position: relative; }
fieldset[disabled]::after { content: ''; display: inline-block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: all; background: rgba(128,128,128,0.2); }
투명 오버레이를 원한다면 배경 없이는 작동하지 않으므로 배경을 rgba (128,128,128,0)으로 설정하십시오. 위의 IE9 +에서 작동합니다. 다음과 같은 훨씬 간단한 CSS는 IE11 +에서 작동합니다.
[disabled] { pointer-events: none; }
크롬
html 문자열 또는 dom 요소를 가져오고 원하지 않는 태그와 속성을 제거하는 구성 가능한 Javascript 라이브러리가 있습니다. 이것을 html sanitizers라고 합니다. 예를 들면 다음과 같습니다.
예를 들어 DOMPurify
DOMPurify.sanitize('<div>abc<iframe//src=jAva	script:alert(3)>def</div>');
// becomes <div>abcdef</div>
편집 : 아래 .on()
방법을 사용했습니다 대신 .bind()
방법 을 사용하십시오
$(this).bind('click', false);
$(this).bind('contextmenu', false);
설정을 제거하려면 .unbind()
방법 을 사용할 수 있습니다 . 이 .off()
방법은 예상대로 작동하지 않습니다.
$(this).unbind('click', false);
$(this).unbind('contextmenu', false);
수백 가지 솔루션을 조사한 후! 포인터 이벤트에 대해 배우면 아래에 내가 한 일이 있습니다.
으로 @Kokodoko가 자신의 솔루션에 언급 된 IE를 제외한 모든 브라우저 경향이있다. IE11pointer-events
에서는 작동 하지만 하위 버전에서는 작동 하지 않습니다. IE11 에서도 포인터 이벤트가 하위 요소에서 작동하지 않는다는 것을 알았습니다 . 따라서 아래와 같은 것이 있다면
<a href="www.preshmalinetpereira.wordpress.com"><i class="car icon"></i><span>My Blog</span></a>
여기서 span 은 하위 요소 이며 설정pointer-events: none
실 거예요 작업을
이 문제를 극복하기 위해 IE의 포인터 이벤트로 작동하고 하위 버전에서 작동하는 함수를 작성했습니다.
JS 파일에서
DisablePointerEvents(".DisablePointerEvents");
function DisablePointerEvents(classId) {
$(classId).each(function () {
$(this).on('click', false );
$(this).on('contextmenu', false );
});
}
CSS 파일에서
.DisablePointerEvents{
pointer-events: none;
opacity: 0.7;
cursor: default;
}
HTML에서
<a href="www.preshmalinetpereira.wordpress.com" class="DisablePointerEvents"><i class="car icon"></i><span>My Blog</span></a>
이것은 작동하지 않는 위의 자식 요소 상태가 발생 하는 pointer-events
시나리오를 위조했습니다 pointer-events
.
같은 JS 피들
간단한 솔루션
내 선택기를 봐
$myForm.find('#fieldsetUserInfo input:disabled').prop("disabled", false);
그만큼 fieldsetUserInfo
DIV 내가 사용하지 않거나 사용하려는 모든 입력을 포함합니다
이것이 당신을 도울 수 있기를 바랍니다