Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Givanildo_Silva

Função Javascript não reconhece Class de Polyline SGV criada dinamicamente com Javascript

Recommended Posts

 

Srs sou principiante na Linguagem Javascript e estou tendo dificuldades em implementar um projeto, peço ajuda .

Neste projeto crio dinamicamente  com Javascript polylines dentro de um SVG, cada polyline e criada com duas Classes (draggable e tooltip), a Class draggable é reconhecida normalmente, mas a tooltip não é reconhecida, quando a tag polyline com as classes é adicionada normalmente dentro do index funciona corretamente.

 

abaixo códigos do projeto:

 

Função ocultar polyline:

let valor;

let checagem;

function teste(checkbox) {

    valor = checkbox.value;
    checagem = checkbox.checked;
}

function ocultar(){

    let polyline = document.getElementsByTagName("polyline");       
    let equipe = document.getElementsByName("equipe");



        if(checagem === true){

            for(j=0;j<polyline.length;j++){
                if(polyline[j].getAttribute("name")=== valor){
                    polyline[j].setAttributeNS(null, "visibility", "hidden");
                }
            }
            
        }

        if(checagem ===false){

            for(j=0;j<polyline.length;j++){
                if(polyline[j].getAttribute("name")===valor){
                    polyline[j].setAttributeNS(null, "visibility", "visible");
                }
            }
            
        }
    
           
 


}
<!DOCTYPE html>
<html lang="pt-br">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">         
        <link rel="stylesheet" href="_css/estilo_principal.css">
        <script src="js/arrastar.js"></script>
        <script src="js/tooltip.js"></script>
        <script src="js/ocultar.js"></script>
        

        <title>Painel Diagrama</title>
    </head>
    <body>

        <div id="painel">

            <input type="button" value="Desenhar" onclick="criarlinha()"/>
             
            <div id="itens" class="w3-container">
                <div class="w3-dropdown-hover">
                    <input type="button" id="equipe-1" value="Equipes" title="Selecione uma Equipe para oculta-lá"/> 
                    <div  class="w3-dropdown-content w3-bar-block w3-border">
                        <ul id="equipes">

                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div id="diagrama" >
            <svg id="tela" width="14800px" height="2640px"  viewBox="0 0 14800 2640" onload="makeDraggable(evt); tooltip(evt)">


                <g id="tooltip" visibility="hidden" >
                    <rect x="2" y="2" width="80" height="85" fill="black" opacity="0.4" rx="2" ry="2"/>
                    <rect width="80" height="85" fill="grey" rx="2" ry="2"/>
                    <text x="4" y="6">Tooltip</text>
                    <line x1="2" y1="23" x2="170" y2="23" stroke="black" stroke-width="2"></line>
                    <text x="4" y="26">Tooltip</text>
                    <line x1="2" y1="43" x2="170" y2="43" stroke="black" stroke-width="2"></line>
                    <text x="4" y="46">Tooltip</text>
                    <line x1="2" y1="63" x2="170" y2="63" stroke="black" stroke-width="2"></line>
                    <text x="4" y="66">Tooltip</text>
                </g>
               <polyline class="draggable tooltip" name="teste" points="885 980 1200 980" stroke="green"  stroke-width="10" fill="none"  equipe="Equipe: Teste" os="os: 27493/2019" trecho="Trecho: Teste1" fiscal="Fiscal: Fulano de Tal"/>


            </svg>
            
        </div>       
                    
        
        <script src="js/linhasvg.js"></script>

    </body>
    

</html>

Função tooltip:

function tooltip(evt) {
    var svg = document.getElementById('tela');
    var tooltip = svg.getElementById('tooltip');
    var tooltipText = tooltip.getElementsByTagName('text')[1];
    var tooltipText1 = tooltip.getElementsByTagName('text')[0];
    var tooltipText2 = tooltip.getElementsByTagName('text')[2];
    var tooltipText3 = tooltip.getElementsByTagName('text')[3];
    var tooltipRects = tooltip.getElementsByTagName('rect');
    var triggers = svg.getElementsByClassName('tooltip');
    var line = svg.getElementsByTagName('line');
    
    for (var i = 0; i < triggers.length; i++) {
        triggers[i].addEventListener('mousemove', showTooltip);
        triggers[i].addEventListener('mouseout', hideTooltip);			
    }

    function showTooltip(evt) {
        var CTM = svg.getScreenCTM();
        var x = (evt.clientX - CTM.e + 6) / CTM.a;
        var y = (evt.clientY - CTM.f + 20) / CTM.d;
        tooltip.setAttributeNS(null, "transform", "translate(" + x + " " + y + ")");
        tooltip.setAttributeNS(null, "visibility", "visible");

        tooltipText.firstChild.data = evt.target.getAttributeNS(null, "equipe");
        tooltipText1.firstChild.data = evt.target.getAttributeNS(null, "os"); 
        tooltipText2.firstChild.data = evt.target.getAttributeNS(null, "trecho"); 
        tooltipText3.firstChild.data = evt.target.getAttributeNS(null, "fiscal");       
        var length = tooltipText.getComputedTextLength();
        for (var i = 0; i < tooltipRects.length; i++) {
            tooltipRects[i].setAttributeNS(null, "width", length + 15);
            line[i].setAttributeNS(null,"x2",length + 15)
        }
    }

Função linhasvg:

let svg = document.querySelector("svg");


let status = true;

function criarlinha(){

    let linha = document.createElementNS("http://www.w3.org/2000/svg","polyline");

    let pontos = [];

    let equipes = document.getElementsByTagName("li")
    let equipe = prompt("Informe o nome do Setor.")

    let checar = document.getElementsByClassName("equipe")




    for (let i = 0; i < 4; i ++ ){
        pontos.push(Number(prompt("Informe os valor")));
    }
    linha.setAttribute("class","draggable tooltip");
    linha.setAttribute("name",equipe);
    linha.setAttribute( "points", pontos);
    linha.setAttribute("fill", "none");
    linha.setAttribute("stroke","green");
    linha.setAttribute("stroke-width", 6);
    linha.setAttribute("equipe",equipe)
    linha.setAttribute("os","2997/2019")
    linha.setAttribute("trecho","POA/CVN")
    linha.setAttribute("fiscal","Fiscal: Fulano de Tal")

    svg.appendChild(linha);
    pontos = [];

    let quantidade_li = equipes.length

    if (quantidade_li > 0) {

        for (let i = 0; i < checar.length; i++) {

            if ( checar[i].value === equipe){
                status = false;

            }


        }

    }


    if(status !== false){
        
    
    
    
        let lis; 
    
        let ul = document.getElementById("equipes"); 
    
        let l1 = document.getElementsByTagName("li"); 
    
        let li = document.createElement("li"); 
    
        let span = document.createElement("span"); 
    
        var input = document.createElement("input"); 
    
        input.type ="checkbox"; 
    
        input.value = equipe; 
    
        input.className="equipe"; 
    
        input.name="equipe"; 

        input.setAttribute("onclick","teste(this), ocultar()")
    
        span.innerText= equipe; 

    
        ul.appendChild(li); 

        if (l1.length > 0) {

            lis = l1.length - 1; 
        }

        else{
            lis = l1.length;
        }
        l1[lis].appendChild(span); 
    
        l1[lis].before(input, span); 


        }
        let item = document.getElementsByClassName("equipe")
        let poly = document.getElementsByTagName("polyline")


        for (let i = 0; i < item.length;i++){
            for(j = 0; j < poly.length; j++){
                if (item[i].attributes[1].value === poly[j].attributes[1].value){
                    if(item[i].checked === true){
                        poly[j].setAttribute( "visibility", "hidden")

                    }

                }
            }


        }
    }

Função arrastar:

function makeDraggable(evt) {
    let svg = evt.target;

    svg.addEventListener('mousedown', startDrag);
    svg.addEventListener('mousemove', drag);
    svg.addEventListener('mouseup', endDrag);
    svg.addEventListener('mouseleave', endDrag);
    svg.addEventListener('touchstart', startDrag);
    svg.addEventListener('touchmove', drag);
    svg.addEventListener('touchend', endDrag);
    svg.addEventListener('touchleave', endDrag);
    svg.addEventListener('touchcancel', endDrag);
    svg.addEventListener('click', clicar);


    function getMousePosition(evt) {
        let CTM = svg.getScreenCTM();
        if (evt.touches) { evt = evt.touches[0]; }
        return {
            x: (evt.clientX - CTM.e) / CTM.a,
            y: (evt.clientY - CTM.f) / CTM.d

        };


    }

    let selectedElement, offset, transform;

    function startDrag(evt) {
        if (evt.target.classList.contains('draggable')) {
            selectedElement = evt.target;
            offset = getMousePosition(evt);

            // Make sure the first transform on the element is a translate transform
            let transforms = selectedElement.transform.baseVal;

            if (transforms.length === 0 || transforms.getItem(0).type !== SVGTransform.SVG_TRANSFORM_TRANSLATE) {
                // Create an transform that translates by (0, 0)
                let translate = svg.createSVGTransform();
                translate.setTranslate(0, 0);
                selectedElement.transform.baseVal.insertItemBefore(translate, 0);
            }

            // Get initial translation
            transform = transforms.getItem(0);
            offset.x -= transform.matrix.e;
            offset.y -= transform.matrix.f;
        }
    }

    function drag(evt) {
        if (selectedElement) {
            evt.preventDefault();
            let coord = getMousePosition(evt);
            transform.setTranslate(coord.x - offset.x, coord.y - offset.y);
        }

    }

    function clicar(evt) {
        if (selectedElement) {
            evt.preventDefault();
            let coord = getMousePosition(evt);
            transform.setTranslate(coord.x - offset.x, coord.y - offset.y);
        }
        alert("X= " + getMousePosition(evt).x  + " Y= " + getMousePosition(evt).y)
    }
    function endDrag(evt) {
        selectedElement = false;
    }


}

Estilo estilo_principal:

@charset "utf-8";


svg#tela{
    background: url("_imagens/diagrama.png") no-repeat;
    
}

div#diagrama{
    position: absolute;
    border: 2px solid black;
    top: 180px;
    left: 30px;
    width: 95%;
    height: 80%;
    overflow: auto;
}

div#painel{
    position: absolute;
    border: 1px solid black;
    padding: 10px;
    left: 30px;

}

div#painel input{
    text-align: center;
       
}

input#equipe-1{
    width: 150px;
    margin-left: -10px;      
}

div#itens{    
    float: right;
    width: 165px;  
}

.equipe{
    margin-left: 5px;
}

span{
    margin-left: 5px;
}

ul#equipes{    
    padding-left: 0px;
    padding-top: -15x;   
}

ul#equipes li{      
    list-style: none;    
    padding: 1px; 
    
}

svg text{
    fill: white;
}

#tooltip {
    dominant-baseline: hanging; 
}

.draggable{
    cursor: move;
}

Desde já agradeço a atenção e colaboração.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente seu tópico está relacionado ao elemento polyline e sua descrição ao tooltip isso deixa confuso para saber qual realmente é o seu problema:

 

 

linhasvg:

1 - remova o constructor Number afinal você deve receber uma sequencia numerica ex:"2,5,100,150" já que esse elemento espera pontos de x,y, enviando apenas um numero ex: "2" não basta para criar uma linha logo nada é exibido, o Number deve ser removido já que não essa sequencia não seja um int ou float e sim uma string

2 - foi adicionado um eventListener ao elemento criado dinamicamente afinal após o carregamento da pagina o script tooltip não é chamado novamente para que consiga identificar os novos elementos então essa alteração acredito ser inevitável

 

//Antes
function criarlinha() {
 // ...
 for (let i = 0; i < 4; i ++ ){
   pontos.push(Number(prompt("Informe os valor")));
 }
  
 linha.setAttribute("class","draggable tooltip");
 linha.setAttribute("name",equipe);
 linha.setAttribute( "points", pontos);
 linha.setAttribute("fill", "none");
 linha.setAttribute("stroke","green");
 linha.setAttribute("stroke-width", 6);
 linha.setAttribute("equipe",equipe)
 linha.setAttribute("os","2997/2019")
 linha.setAttribute("trecho","POA/CVN")
 linha.setAttribute("fiscal","Fiscal: Fulano de Tal");
}

//Depois
function criarlinha(){
  // ...
  for (let i = 0; i < 4; i ++ ){
    pontos.push(prompt("Informe os valor")); // linha modificada
  }
  
  linha.setAttribute("class","draggable tooltip");
  linha.setAttribute("name",equipe);
  linha.setAttribute( "points", pontos);
  linha.setAttribute("fill", "none");
  linha.setAttribute("stroke","green");
  linha.setAttribute("stroke-width", 6);
  linha.setAttribute("equipe",equipe)
  linha.setAttribute("os","2997/2019")
  linha.setAttribute("trecho","POA/CVN")
  linha.setAttribute("fiscal","Fiscal: Fulano de Tal");
  linha.addEventListener('mouseover', tooltip); // linha adicionada
}

 

Tooltip:

 

1 - Foi adicionado um novo evento para que o tooltip seja exibido após o evento hover no polyline criado

2 - Foi adicionado o método hideTooltip já que estava faltando no código postado nesse post

function tooltip(evt) {
  // ....
  for (var i = 0; i < triggers.length; i++) {
    triggers[i].addEventListener('mousemove', showTooltip);
    triggers[i].addEventListener('mouseout', hideTooltip);
    triggers[i].addEventListener('mouseover', showTooltip); // linha adicionada
  }
  
  // ...
  function hideTooltip(evt) { // metodo adicionado
    tooltip.setAttributeNS(null, "visibility", "hidden");
  }
}

Ex: https://playcode.io/481497?tabs=tooltip.js,preview

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.

      Estou com uma dúvida, referente cálculo de valores em tempo real.

      Tenho uma rotina, que faz o cálculo, o problema é mostrar o resultado.

      Quero mostrar o RESULTADO assim: 0,00  ou  0.00

      Abaixo posto o código.
      jQuery('input').on('keyup',function(){ //Remover ponto e trocar a virgula por ponto var m = document.getElementById("pgRest").value; while (m.indexOf(".") >= 0) { m = m.replace(".", ""); } m = m.replace(",","."); //Remover ponto e trocar a virgula por ponto var j = document.getElementById("pgDsct").value; while (j.indexOf(".") >= 0) { j = j.replace(".", ""); } j = j.replace(",","."); m = parseFloat(jQuery('#pgRest').val() != '' ? jQuery('#pgRest').val() : 0); j = parseFloat(jQuery('#pgDsct').val() != '' ? jQuery('#pgDsct').val() : 0); //Mostra o Resultado em Tempo Real jQuery('#pgTroco').val(m - j); <<=== aqui estou errando })  
       
      Grato,
       
      Cesar
       
       
    • Por violin101
      Caro amigos, saudações.

      Tenho uma tabela escrita em JS que funciona corretamente.
       
      Minha dúvida:
      - como devo fazer para quando a Tabela HTML estiver vazia, exibir o LOGO da Empresa ?

      Abaixo posto o script:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'i' ) return;// Não é Ctrl+A, portanto interrompemos o script evt.preventDefault(); //Chama a Função Calcular Qtde X Valor Venda calcvda(); var idProdutos = document.getElementById("idProdutos").value; var descricao = document.getElementById("descricao").value; var prd_unid = document.getElementById("prd_unid").value; var estoque_atual = document.getElementById("estoque_atual").value; var qtde = document.getElementById("qtde").value; var vlrunit = document.getElementById("vlrunit").value; var vlrtotals = document.getElementById("vlrtotal").value; var vlrtotal = vlrtotals.toLocaleString('pt-br', {minimumFractionDigits: 2}); if(validarConsumo(estoque_atual)){ //Chama a Modal com Alerta. $("#modal_qtdemaior").modal(); } else { if(qtde == "" || vlrunit == "" || vlrtotal == ""){ //Chama a Modal com Alerta. $("#modal_quantidade").modal(); } else { //Monta a Tabela com os Itens html = "<tr style='font-size:13px;'>"; html += "<td width='10%' height='10' style='text-align:center;'>"+ "<input type='hidden' name='id_prds[]' value='"+idProdutos+"'>"+idProdutos+"</td>"; html += "<td width='47%' height='10'>"+ "<input type='hidden' name='descricao[]' value='"+descricao+"'>"+descricao+ "<input type='hidden' name='esp[]' value='"+prd_unid+"'> - ESP:"+prd_unid+ "<input type='hidden' name='estoq[]' value='"+estoque_atual+"'></td>"; html += "<td width='10%' height='10' style='text-align:center;'>"+ "<input type='hidden' name='qtde[]' value='"+qtde+"'>"+qtde+"</td>"; html += "<td width='12%' height='10' style='text-align:right;'>"+ "<input type='hidden' name='vlrunit[]' value='"+vlrunit+"'>"+vlrunit+"</td>"; html += "<td width='14%' height='10' style='text-align:right;'>"+ "<input type='hidden' name='vlrtotal[]' value='"+vlrtotal+"'>"+vlrtotal+"</td>"; html += "<td width='12%' height='10' style='text-align:center;'>"+ "<button type='button' class='btn btn-uvas btn-remove-produto' style='margin-right:1%; padding:1px 3px; font-size:12px;' title='Remover Item da Lista'>"+ "<span class='fa fa-minus' style='font-size:12px;'></span></button></td>"; html += "</tr>"; $("#tbventas tbody").append(html); //Função para Somar os Itens do Lançamento somar(); $("#idProdutos").val(null); $("#descricao").val(null); $("#prd_unid").val(null); $("#qtde").val(null); $("#vlrunit").val(null); $("#vlrtotal").val(null); $("#idProdutos").focus(); //Se INCLUIR NOVO produto - Limpa a Forma de Pagamento $("#pgSoma").val(null); $("#pgRest").val(null); $("#pgDsct").val(null); $("#pgTroco").val(null); $("#tbpagar tbody").empty(); }//Fim do IF-qtde }//Fim do Validar Consumo });//Fim da Função btn-agregar  
      Grato,

      Cesar
       
    • Por violin101
      Caros amigos, saudações.

      Estou com uma pequena dúvida se é possível ser realizado.

      Preciso passar 2 IDs para o Sistema executar a função, estou utilizando desta forma e gostaria de saber como faço via JS para passar os parâmetro que preciso.

      Observação:
      Dentro da TABELA utilizei 2 Forms, para passar os IDS que preciso, funcionou conforme código abaixo.
      <div class="card-body"> <table id="tab_clie" class="table table-bordered table-hover"> <thead> <tr> <th style="text-align:center; width:10%;">Pedido Nº</th> <th style="text-align:center; width:10%;">Data Pedido</th> <th style="text-align:center; width:32%;">Fornecedor</th> <th style="text-align:center; width:10%;">Status</th> <th style="text-align:center; width:5%;">Ação</th> </tr> </thead> <tbody> <?php foreach ($results as $r) { $dta_ped = date(('d/m/Y'), strtotime($r->dataPedido)); switch ($r->pd_status) { case '1': $status = '&nbsp;&nbsp;Aberto&nbsp;&nbsp;'; $txt = '#FFFFFF'; //Cor: Branco $cor = '#000000'; //Cor: Preta break; case '2': $status = 'Atendido Total'; $txt = '#FFFFFF'; //Cor: Branco $cor = '#086108'; //Cor: Verde break; case '3': $status = 'Atendido Parcial'; $txt = '#000000'; //Cor: Branco $cor = '#FEA118'; //Cor: Amarelo break; default: $status = 'Cancelado'; $txt = '#FFFFFF'; //Cor: Branco $cor = '#D20101'; //Cor: Vermelho break; } echo '<tr>'; echo '<td width="10%" height="10" style="text-align:center;">'.$r->pd_numero.'</td>'; echo '<td width="10%" height="10" style="text-align:center;">'.$dta_ped.'</td>'; echo '<td width="32%" height="10" style="text-align:left;">'.$r->nome.'</td>'; echo '<td width="10%" height="10" style="text-align:left;"><span class="badge" style="color:'.$txt.'; background-color:'.$cor.'; border-color:'.$cor.'">'.$status.'</span></td>'; echo '<td width="5%" style="text-align:center;">'; ?> <div class="row"> <?php if($this->permission->checkPermission($this->session->userdata('permissao'), 'vPedido')){ ?> <form action="<?= base_url() ?>compras/pedidos/visualizar" method="POST" > <input type="hidden" name="idPedido" value="<?php echo $r->idPedidos; ?>"> <input type="hidden" name="nrPedido" value="<?php echo $r->pd_numero; ?>"> <button class="btn btn-warning" title="Visualizar" style="margin-left:50%; padding: 1px 3px;"><i class="fa fa-search icon-white"></i></button> </form> <?php } if($this->permission->checkPermission($this->session->userdata('permissao'), 'ePedido')){ ?> <form action="<?= base_url() ?>compras/pedidos/editar" method="POST" > <input type="hidden" name="idPedido" value="<?php echo $r->idPedidos; ?>"> <input type="hidden" name="nrPedido" value="<?php echo $r->pd_numero; ?>"> <button class="btn btn-primary" title="Editar" style="margin-left:50%; padding: 1px 3px;"><i class="fa fa-edit icon-white"></i></button> </form> <?php } ?> </div> <?php echo '</td>'; echo '</tr>'; } ?> </tbody> </table> </div>
      Grato,

      Cesar.
    • Por belann
      Olá!
       
      Estou usando o editor quill em uma página html, sem fazer a instalação com npm, mas usando as api´s via internet com http, no entanto não consigo fazer a tecla enter funcionar para mudança de linha, tentei essa configuração abaixo, mas não funcionou.
       
      modules: {       syntax: true,       toolbar: '#toolbar-container',       keyboard: {         bindings: {           enter: {             key: 13,             handler: function(range, context) {                       quill.formatLine(range.index, range.length, { 'align': '' });             }           }  
       
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de poder tirar uma dúvida com os amigos.
       
      Como faço uma função para Comparar a Data Digitada pelo o Usuário com a Data Atual ?

      Data Digitada:  01/09/2024
       
      Exemplo:
      25/09/2024 é menor que DATA Atual  ====> mensagem: informe uma data válida.
      25/09/2024 é igual DATA Atual ===> o sistema libera os INPUT's.
       
      Como faço uma comparação com a Data Atual, para não Deixar Gravar Data retroativa a data Atual.
       
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.