Я был в предположении, что если я отключил div, все содержимое также было отключено.
Однако содержимое серого, но я все еще могу взаимодействовать с ним.
Есть ли способ сделать это? (отключите div и отключите все содержимое)
Я был в предположении, что если я отключил div, все содержимое также было отключено.
Однако содержимое серого, но я все еще могу взаимодействовать с ним.
Есть ли способ сделать это? (отключите div и отключите все содержимое)
Многие из вышеперечисленных ответов работают только с элементами формы. Простой способ отключить любой 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');
}
}
Отключить и включить элементы ввода в блоке Div Использование jQuery должно помочь вам!
Как и для jQuery 1.6, вы должны использовать .prop
вместо .attr
для отключения.
Я просто хотел упомянуть этот метод расширения для включения и отключения элементов. Я считаю, что это гораздо более чистый способ, чем добавление и удаление атрибутов напрямую.
Затем вы просто выполните:
$("div *").disable();
Вот быстрый комментарий для людей, которым не нужен div, а просто блок. В HTML5 <fieldset disabled="disabled"></fieldset>
появился отключенный атрибут. Каждый элемент формы в отключенном поле отключен.
Отключенный атрибут не является частью спецификации W3C для элементов DIV, только для .
Подход jQuery, предложенный Мартином, - единственный надежный способ, которым вы это сделаете.
похож на решение cletu, но я получил ошибку, используя это решение, это обходной путь:
$('div *').prop('disabled',true);
// or
$('#the_div_id *').prop('disabled',true);
отлично работает на меня
Вы можете использовать эту простую инструкцию 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);
}
}
Элементы управления HTML могут быть отключены с помощью атрибута "disabled" , как вы знаете. Когда атрибут "disabled" для элемента управления ввода установлен, обработчики событий, связанные с таким элементом управления, не вызываются.
Вы должны моделировать поведение выше для элементов HTML, которые не поддерживают атрибут "disabled" , например div, если хотите.
Если у вас есть div, и вы хотите поддерживать клик или ключевое событие в этом div, вам нужно сделать две вещи: 1) Если вы хотите отключить div, установите его отключенный атрибут как обычно (только для соответствия этому соглашению) 2) В обработчике div и/или обработчиках ключей проверьте, отключен ли атрибут div в div. Если это так, то просто игнорируйте событие click или key (например, сразу возвращайтесь). Если отключенный атрибут не установлен, выполните логику div и/или ключевое событие.
Вышеуказанные шаги также независимы от браузера.
Один из способов добиться этого - добавить отключенную опору всем детям из div. Вы можете достичь этого очень легко:
$("#myDiv").find("*").prop('disabled', true);
$("#myDiv")
находит div, .find("*")
получает вас всех дочерних узлов на всех уровнях, а .prop('disabled', true)
отключает каждый.
Таким образом, все содержимое отключено, и вы не можете щелкнуть по ним, перейти к ним, прокрутить их и т.д. Кроме того, вам не нужно добавлять классы css.
Оберните div
в тег fieldset
:
<fieldset disabled>
<div>your controls</div>
</fieldset>
Мне казалось, что я запишу пару заметок.
Это для поисковиков,
Лучшее, что я сделал,
$('#myDiv *').attr("disabled", true);
$('#myDiv *').fadeTo('slow', .6);
Как упоминалось в комментариях, вы по-прежнему можете получить доступ к элементу, перемещаясь между элементами с помощью клавиши табуляции. поэтому я рекомендую это:
$("#mydiv")
.css({"pointer-events" : "none" , "opacity" : "0.4"})
.attr("tabindex" , "-1");
Если вы хотите сохранить семантику отключенной, как показано ниже
<div disabled="disabled"> Your content here </div>
вы можете добавить следующий CSS
div[disabled=disabled] {
pointer-events: none;
opacity: 0.4;
}
преимущество здесь в том, что вы не работаете с классами в 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 во всех браузерах.
JavaScript:
$("#myDiv")
.addClass("disable")
.click(function () {
return false;
});
Css:
.disable {
opacity: 0.4;
}
// Disable scrolling on child elements
.disable div,
.disable textarea {
overflow: hidden;
}
Чтобы отключить содержимое DIV во всех браузерах, кроме IE10 и ниже.
JavaScript:
$("#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 и "отключенный" класс.
Примечание: не используйте отключенный атрибут.
Не нужно связываться с 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 отключен, вы все равно сможете использовать входы/содержимое DIVs. То же самое касается и вышеупомянутых ответов.
$("#yourdivid textarea, #yourdivid input, #yourdivid select").attr('disabled',true);
Это решение css only/noscript добавляет наложение над набором полей (или 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; }
Chrome
Если вы просто пытаетесь остановить нажатие людей и не ужасно беспокоитесь о безопасности - я нашел абсолютный помещенный div с z-индексом 99999, это хорошо. Вы не можете щелкнуть или получить доступ к любому содержимому, потому что над ним размещен div. Возможно, это будет немного проще и будет единственным решением для CSS, пока вам не понадобится его удалить.
EDIT:
Ниже я использовал метод .on()
, вместо этого используйте метод .bind()
$(this).bind('click', false);
$(this).bind('contextmenu', false);
чтобы удалить настройки, вы можете использовать метод .unbind()
. В то время как метод .off()
работает не так, как ожидалось.
$(this).unbind('click', false);
$(this).unbind('contextmenu', false);
После исследования сотен решений! узнав о указателях-событиях, ниже - то, что я сделал.
Как @Kokodoko, упомянутый в его решении, который подходит для всех браузеров, кроме IE. pointer-events
работают в IE11, а не в более низких версиях. Я также заметил, что в 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 Fiddle для того же
решение для симплекса
посмотри мой селектор
$myForm.find('#fieldsetUserInfo input:disabled').prop("disabled", false);
fieldsetUserInfo
- div содержит все входы, которые я хочу отключить, или Включить
надеюсь, что это поможет вам