Pergunta

Estou no meu juízo final, e provavelmente é algo realmente simples. Basicamente, tenho este código:

var menuitem = document.getElementById('mymenuitem');
alert(menuitem);
alert(varImChecking == null);
menuitem.setAttribute('disabled', (varImChecking == null) ? 'true' : 'false');

Deveria desativar o item de menu 'mymenuitem', mas não tem efeito. Quando executado, os alertas dizem '[objeto xulelement]' seguido por 'true'. Eu sei que o getElementById está selecionando o elemento Menuitem correto, porque as ligações de cliques no trabalho variável do menuitem.

Algumas alternativas que eu tentei:

menuitem.setAttribute('disabled', (varImChecking == null));
menuitem.disabled = (varImChecking == null);

Então, por que o setattribute não está tendo algum efeito? Nem sequer acorda o item de menu. Existe outra maneira de fazer isso?

Editar: Esqueceu de mencionar, nenhum aviso ou erros aparece no console.

Foi útil?

Solução 3

Acho que finalmente descobri isso. O problema é que eu tinha o menuitem que estava tentando editar era codificado dentro de um arquivo .xul. Por qualquer motivo, isso tornou impossível alterar os atributos desativados ou ocultos.

Então eu removi o menuitem do arquivo .xul e o criou dinamicamente no JavaScript em vez de. Agora funciona exatamente como o esperado:

var menuitem = document.getElementById('mypopupitem').appendChild(document.createElement('menuitem'));
menuitem.setAttribute('disabled', 'true'); // Works.
menuitem.removeAttribute('disabled'); // Also works.

Alguém sabe, isso é um recurso/peculiaridade de Xul, ou estou apenas fazendo errado?

ATUALIZAR: Como muitos comentários apontaram, o acima não está correto. Você absolutamente pode alterar o atributo desativado em um item codificado em um arquivo xul.

Depois de muito mais depuração, diminuindo o problema aos seus elementos centrais, puxando cabelos, etc., acabou sendo ... um erro de digitação. Grrr .. desculpe.

Acontece que meu documento.getElementById ('Menuitem') estava pegando o elemento Xul, não o elemento. O fato de o método OnClick parecer disparar corretamente parece ter sido graças ao Event Bubbling (eu acho?). Ainda não tenho idéia do porquê do SetAttribute ('Label', 'Alterou') funcionou quando tentei isso, mas infelizmente, no frenesi de depuração, não tenho essa versão para verificar novamente.

De qualquer forma, está funcionando agora, sem ter que criar dinamicamente o menuitem. Obrigado por toda a ajuda!

Outras dicas

Em relação à questão incapacitante: se um menuitem contiver um comando, o menuitem só poderá ser desativado definindo o atributo "desativado" desse comando. Se o Menuitem contiver um OnCommand, o incapacitante deve funcionar no próprio menu.

Eu acredito que o setattribute vai Procure uma string "True"/"false", como você originalmente tinha.

Embora eu não veja um bug imediatamente no motivo pelo qual você não pode desativar. Para um teste, você tentou simplesmente menuitem.setAttribute ('desativado', 'true'); ? Se isso não funcionar - talvez nada o fará. Parece estranho desativar um menuitem - você tem certeza de que não está querendo desativar o menulista?

Eu vejo um problema com seu código de habilitação. Não consigo encontrar uma ótima documentação para isso, mas lidei com isso anteriormente. Um exemplo que você pode encontrar em Bugzilla é o fato de a configuração desativada = false Na verdade, desativa os itens no Linux. O caminho recomendado de Mozilla é remover o atributo quando você deseja que ele seja ativado.

Portanto, embora sua solução seja mais concisa, você provavelmente deve olhar para algo mais assim:

var menuitem = document.getElementById('mymenuitem');
alert(menuitem);
alert(varImChecking == null);
if(null==varImChecking){
   menuitem.setAttribute('disabled', 'true');
}else{
   menuitem.removeAttribute('disabled');
}

Eu tive o mesmo problema. Eu usei itens icônicos de menu junto com comandos. A pista era definir o atributo desativado do menuitem e o comando como verdadeiro ou falso. Eu também tive que definir o atributo desativado depois que o painevopup dos pais foi aberto, ei onpopupshown. Agora posso atualizar meus menuitems dinamicamente.

Passei mais de uma hora para resolver esse problema XD, espero que isso ajude as pessoas a minimizar suas despesas de tempo.

POR FALAR NISSO:

  1. Meu Xul está dentro de uma extensão de Firebug

Pode ser que isso funcione:

var menuitem = document.getElementById('mymenuitem');
alert(menuitem);
alert(varImChecking == null);
menuitem.setAttribute('disabled', (varImChecking == null) ? true : false);

Eu usei verdadeiro e falso, em vez de 'verdadeiro' e 'falso'

Estou usando a tag para adicionar um menu de contexto personalizado. Quando uso o evento "OnPopupsHowing" para lidar com a ativação/desativação de um itens de menu, meu menu de contexto está sendo preenchido com muitos itens de menu que não pretendi adicionar. Aqui está a nova tag pop -up que eu adicionei no sobreposição.xul

u003Cpopup onpopupshowing="isAssertTextEnabled(this)" id="contentAreaContextMenu">
u003Cmenuitem id="context-recorderpopup" label="Assert text present"
AccessKey = "T"
insertafter = "context-stop" onCommand = "OnassertionMenu (evento)" />
u003C/popup>

por favor me avise se estou perdendo algo

Obrigado, Vinay

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top