Ir para conteúdo

Arquivado

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

manolegal

Autocomplete em input dinâmico

Recommended Posts

Bom dia amigos.

Realizei diversas pesquisas, porém não consegui resolver o problema.

Em campos normais do formulário, o Autocomplete está funcionando normalmente.

Não estou conseguindo fazer funcionar em input dinâmico, dentro de uma tabela onde posso inserir diversas linhas.

 

Meu campo:

<div id="list" class="row-fluid">                  
<table class="table" cellspacing="1" cellpadding="1" id="detalhes">
    <caption>Detalhes do Documento</caption>
        <thead>
            <tr>
                <th style="text-align:center; background: #FFFF99;">Produto</th>
            </tr>
        </thead>
  
<?php
for($i=0; $i<count($produto); $i++) {
?> 
        
        <tbody>
            <tr>
                <td><?php $y=$i+1; echo"$y"; ?>
                <td>
                    <input name="produto[]" id="produto" type="text" size="12" maxlength="10" value="<?php echo "$produto[$i]";?>">
                </td>
            </tr> 
        </tbody>
        
<?php } // Fecha "for"   ?> 
  
        <tfoot>
            <tr>
                <td colspan="4">
                    <button type="button" class="btn-mini btn-primary" onclick="addRowToTable();">Adicionar</button>
                    <button type="button" class="btn-mini btn-danger" onclick="removeRowFromTable();">Remover</button>
                    <button type="button" class="btn-mini btn-success" href="#" data-toggle="modal" data-target="#modal_cad_produto" title="Clique aqui para cadastrar um novo Produto!">Cadastrar Novo Produto</button>
                </td>
            </tr>
        </tfoot>
  
</table>

Meu código js para adicionar/remover inputs dinâmicos:

<script language="javascript" type="text/javascript">
function addRowToTable() {
var tbl = document.getElementById('detalhes');
//var lastRow = tbl.rows.length -1;
var lastRow = tbl.rows.length;
// if there's no header row in the table, then iteration = lastRow + 1 - //se não houver cabeçalho da linha da tabela, depois iteração lastRow + 1
var iteration = lastRow - 1;
//var row = tbl.insertRow(lastRow + 1); // cria outra linha
var row = tbl.insertRow(lastRow); // cria outra linha


// NÚMERO DA CÉLULA
var cellLeft = row.insertCell(0); // insere uma celula a esquerda
var textNode = document.createTextNode(iteration); // esquerda cria o numero
cellLeft.setAttribute('align', 'center');
cellLeft.setAttribute('class', 'branco');
cellLeft.appendChild(textNode); // fecha a celular da esquerda


// right cell (Produto)
var cellRight1 = row.insertCell(1);
var e1 = document.createElement('input');
cellRight1.setAttribute('align', 'left');
e1.setAttribute('class', 'campo');
e1.setAttribute('type', 'text');
e1.setAttribute('name', 'produto');
e1.setAttribute('id', 'produto');
e1.setAttribute('maxlength', '7');
e1.setAttribute('value', '');
e1.setAttribute('size', '10');
//e1.setAttribute('onkeyup', 'multiplica(' + iteration + ')');
e1.setAttribute('onkeypress', 'return handleEnter(this, event)');
cellRight1.appendChild(e1);

function removeRowFromTable() {
    var tbl = document.getElementById('detalhes');
    var lastRow = tbl.rows.length;
    if (lastRow > 2) tbl.deleteRow(lastRow - 1);
}
</script>

 

Meu código Autocomplete:

<script type="text/javascript">
$(document).ready(function() {
$('#detalhes').find('.produto').autocomplete({
    source: "ajx_pes_p_nom.php",
    minLength: 1,
}); 
});
</script>
  

No aguardo

Att

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. 

Primeiro: faltou fechar a função AddRowToTable(). 

 

function addRowToTable() {
  .
  .
  .
  cellRight1.appendChild(e1);
}

Segundo: Seu código JQuery que aplica o AutoComplete deve ficar assim:

<script type="text/javascript">
   $(document).on('DOMNodeInserted','#detalhes .campo', function(){
    $(this).autocomplete({
      source: "ajx_pes_p_nom.php",
      minLength: 1,
    }); 
  }); 
</script>

Para atribuir eventos a elementos criados dinamicamente, deve-se utilizar o método  $(document).on(...). Veja no link abaixo.

http://www.kadunew.com/blog/jquery/atribuindo-eventos-a-elementos-criados-dinamicamente

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pesquisa pelo plugin jquery (select2).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigos.

Funcionou da seguinte forma:

<script type="text/javascript">
$(document).on('DOMNodeInserted','#detalhes .produto', function(){
    $(this).autocomplete({
      source: "ajx_prod_p_nom.php",
      minLength: 1,
    }); 
});
// Ao criar nova linha
</script>

No campo produto incluí ainda:

class="produto"

Em relação ao select2, estou utilizando em alguns formulários, porém quando há um grande número de dados vindo do BD ele se torna muito lento.

 

Tópico resolvido. Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por clovis.sardinha
      Tenho uma consulta de autocomplete no bd que funciona no servidor local e não roda no servidor da web. 
      Ao enviar a consulta no servidor local  aparece no console :Fetch terminou o carregamento: GET ".../Cidade?cidade=sao%20paulo". A pesquisa é feita normalmente.
      Quando mando a mesma pesquisa para o servidor web(locaweb) aparece no console: Fetch terminou o carregamento: GET "..../Cidade?cidade=sao%2520paul".
      O número 25 aparece só no servidor web. Pelo que pesquisei 25 significa %, ou seja, está duplicando o caractere %. 
      Não consegui utilizar nenhuma função para evitar que isto ocorra. Alguém sabe se há alguma configuração no servidor web que possa ser alterada para evitar essa duplicação?
       
    • Por clovis.sardinha
      Estou em um impasse pois sei pouco de javascript. Estou fazendo um autocomplete com CI4 e Javascript.
      Consigo gerar, através do controllers/model do CI4 um arquivo em json, mas não consigo retorná-lo para o javascript para poder mostrar as opções para consulta. 
      O console.log mostra que estou obtendo o  json() { [native code] }.
      Segue os dois arquivos para ver se alguém me ajuda.
      //arquivo cidade.js async function carregar_cidade(valor) { if (valor.length >= 3) { //console.log("Pesquisar:" + valor); const dados = fetch('Testes/?cidade='+valor, { method: "get", headers: { "Content-Type": "application/json", "X-Requested-With": "XMLHttpRequest" } }); const resposta = (await dados).json; console.log(resposta); var html = "<ul class='list-group position-fixed'>"; html += "<li class='list-group-item'>" + resposta['cid_nome'] + "</li>"; html += "</ul>"; } } <?php //arquivo Testes.php namespace App\Controllers; use App\Models\CidadeModel; /** NÃO MANDAR PARA O SERVIDOR - APENAS TESTES DE FUNÇÕES E OUTROS ELEMENTOS DO CI4 */ class Testes extends BaseController{ protected $tbCidades; public function __construct(){ $this->tbCidades = new CidadeModel(); } public function index(){ $request = \Config\Services::request(); $client = \Config\Services::curlrequest(); $cidades=[]; if($get=$request->getGet()){ $cities=$get['cidade']; $cidadeFiltrada=$this->tbCidades->getCidByName($cities); $cidades= json_encode($cidadeFiltrada); //dd($cidades); } echo view('Testes/testes'); } public function salvar(){ $request = \Config\Services::request(); if($post=$request->getPost()){ dd($post); } } } <!doctype html> <html lang="pt-br"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Bootstrap CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <title>Autocomplete</title> </head> <body> <div class="container"> <h1 class="mt-4 mb-4">Formulário</h1> <form class="row g-3"> <div class="col-12"> <label for="cidade" class="form-label">Cidade</label> <input type="text" name="cidade" class="form-control" id="cidade" placeholder="Pesquisar cidade" onkeyup="carregar_cidade(this.value)"> </div> <span ></span> </form> </div> <!-- Optional JavaScript; choose one of the two! --> <!-- Option 1: Bootstrap Bundle with Popper --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> <script src="assets/js/cidade.js"></script> </body> </html>
    • Por klonder
      Olá a todos(as)!
      Estava há 3 dias pesquisando sobre como resolver um problema que estava enfrentando em meu sistema, que consistia no seguinte:
      Implantar um Combobox com dados vindos do banco. Esse combobox deveria ser editável e apresentar os valores em seu popup suspenso. À medida em que o usuário fosse digitando, o autocomplete faria a busca em todos os valores já cadastrados e mostraria os compatíveis (procedimento até então comum em qualquer autocomplete). Todavia, o combobox só poderia perder o foco caso o texto inserido fosse exatamente igual a um dos valores existentes no popup, ou seja, não poderia ser  inserido nada que já não estivesse cadastrado anteriormente e presente na lista de valores.
      Após muito pesquisar, cheguei a um resultado muito satisfatório que compartilho com vocês, visto que varri a internet inteira à procura desse código e não encontrei em lugar nenhum. PyQt5 é extremamente pobre em tutoriais, principalmente em português.
       
      Segue o código que poderá ajudar quem precise:
      from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QComboBox, QLineEdit, QCompleter from PyQt5.QtCore import QSize, Qt, QSortFilterProxyModel, QStringListModel class Ui_Autocomplete(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 200, 800, 600) self.setWindowTitle('Autocomplete com combobox') self.cboxEstado = QComboBox(self) self.cboxEstado.move(50, 50) self.cboxEstado.addItem("Acre") self.cboxEstado.addItem("Amazonas") self.cboxEstado.addItem("Amapá") self.cboxEstado.addItem("Pará") self.cboxEstado.addItem("Rondônia") self.cboxEstado.addItem("Roraima") self.cboxEstado.addItem("Tocantins") self.cboxEstado.addItem("Distrito Federal") self.cboxEstado.addItem("Goiás") self.cboxEstado.addItem("Mato Grosso") self.cboxEstado.addItem("Mato Grosso do Sul") self.cboxEstado.addItem("Alagoas") self.cboxEstado.addItem("Bahia") self.cboxEstado.addItem("Ceará") self.cboxEstado.addItem("Maranhão") self.cboxEstado.addItem("Piauí") self.cboxEstado.addItem("Pernambuco") self.cboxEstado.addItem("Paraíba") self.cboxEstado.addItem("Rio Grande do Norte") self.cboxEstado.addItem("Sergipe") self.cboxEstado.addItem("Paraná") self.cboxEstado.addItem("Rio Grande do Sul") self.cboxEstado.addItem("Santa Catarina") self.cboxEstado.addItem("Espírito Santo") self.cboxEstado.addItem("Minas Gerais") self.cboxEstado.addItem("São Paulo") self.cboxEstado.addItem("Rio de Janeiro") self.cboxEstado.setEditable(True) self.cboxEstado.completer().setCompletionMode(QCompleter.PopupCompletion) self.cboxEstado.completer().setFilterMode(Qt.MatchContains) self.cboxEstado.completer().setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.cboxEstado.focusOutEvent = self.pedeuFoco self.leRegiao = QLineEdit(self) self.leRegiao.move(250,50) self.leRegiao.resize(200, 22) def pedeuFoco(self,event): occur = 0 for i in range(len(self.cboxEstado)): if self.cboxEstado.currentText() == self.cboxEstado.itemText(i): occur = occur+1 if occur == 0: self.cboxEstado.lineEdit().setFocus() self.cboxEstado.lineEdit().selectAll() else: #Retira o cursor do widget QComboBox.focusOutEvent(self.cboxEstado,event) if __name__ == '__main__': import sys app = QApplication(sys.argv) mainWin = Ui_Autocomplete() mainWin.show() sys.exit(app.exec_())  
       
    • Por sthefany silva
      Olá, minha dúvida é ao fazer um selecte em algum as opções do autocomplete mostrar contudo na pág. e ao limpar os dados inseridos no input fazer com que volte ao estado anterior. 
       
      ou seja, ao seleconar ele abrirar o que foi seleconado, ao limpar campus do input mostrar topicos anterior.
       
       
      segue abaixo meus códigos: 
       
      HTML:
       <form class="submit-line" id="form">                           <input  id="buscaPerguntas" autocomplete="off" class="form-control input-faq"                          placeholder="Digite palavras-chaves para pesquisar" style="padding: 28px;">                       </form>                 </div>               </div>         </div>         <div class="row">             <div id="buscaPerguntas-description">             </div>         </div>

                <div class="divFaq" id="listaFaq">             <div class="row">                 {% for valor in faq%}                   <div class="col-sm-12">                       <div class="boxFaq">                         <a class="btn btn-faq accordion" type="button" data-toggle="collapse" data-target="#{{valor.id}}" aria-expanded="true">                              {{valor.pergunta}}                         </a>                     </div>                 </div>                   <div class="col-sm-12">                     <div id="{{valor.id}}" class="collapse">                         <div class="boxFaq">                             <div class="card-body">                                 <div>{{valor.resposta|raw}}</div>                             </div>                         </div>                     </div>                 </div>                   {% endfor %}               </div>
         
       
       
      JAVASCRIPT:
       
      $(function () {       $("#buscaPerguntas").autocomplete({           autoFocus: true,         minLength: 1,         appendTo: '#form',         source: function (request, response) {                        $.ajax({                 url: '/pesquisafaq',                 type: 'post',                 data: {                     dadosPesquisa: request.term                   }                               }).done(function (data) {                   let parse = JSON.parse(data)                   if (parse.length > 0) {                       let dados = Object.values(parse).map((e) => {                           return {                             label: e.pergunta,                             desc: "<div class='divFaqCollapse'><div class='col-sm-12'><div class='boxFaq'><a class='btn btn-faq accordion' type='button' data-toggle='collapse' data-target='#collapse' aria-expanded='true'>" + e.pergunta + "</a></div></div> <div class='col-sm-12'> <div id='collapse' class='collapse'> <div class='boxFaq'> <div class='card-body'> <div>" + e.resposta + "</div> </div> </div> </div> </div> </div>",                           }                       })                     response(dados.slice(0))                 }                                });           },         select: function (event, ui) {               $("#buscaPerguntas").val(ui.item.label);             $("#buscaPerguntas-description").html(ui.item.desc);                        $('#listaFaq').hide();             $('#buscaPerguntas-description').show();                      }       })   });  
    • Por vazzoler
      Bom dia, pessoal. Gostaria de saber se alguém pode me auxiliar na criação de um campo autocomplete, semelhante ao deste site (https://gofretes.com.br/), mais precisamente no campo de pesquisa de cidades, onde, ao iniciar a digitação no campo, buscaria no banco de dados e completaria o preenchimento?
×

Informação importante

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