Jump to content

Michael Granados

Members
  • Content count

    95
  • Joined

  • Last visited

Community Reputation

0 Comum

4 Followers

About Michael Granados

  • Birthday 05/25/1984

Informações Pessoais

  • Sexo
    Masculino
  • Localização
    Santana - São Paulo
  • Interesses
    programação, php, python, ruby on rails, design, e-commerce

Contato

Recent Profile Visitors

1078194 profile views
  1. Vi que está utilizando a jQuery-UI. Parabéns por isso :-) Você pode utilizar o evento change do autocomplete: https://api.jqueryui.com/autocomplete/#event-change Com o AJAX da jQuery: http://api.jquery.com/jQuery.getJSON/ Para isso você vai ter uma "página" que vai imprimir apenas o resultado esperado... imagino algo como resgatavalor.php?pn_nome=XPTO e pegar o $_GET pra fazer a devida consulta no banco de dados. Estou meio sem tempo agora pra explicar... tenta aí e posta a versão final pra gente :-D Qualquer coisa, grita.
  2. Michael Granados

    Capturar click no anúncios dentro do meu site

    Experimente, por conta e risco, acessar via contentWindow. Mas como te falei, lá dentro é vida nova, sem jQuery, propenso ao que existir por lá... Veja um exemplo do uso em https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_iframe_contentdocument
  3. Michael Granados

    Erro Javascript no console

    Ali na primeira linha... jQuery(document).ready(function( $ ) { O .ready executa a função sem passar o argumento $. Então ele deve estar utilizando o método $ global na página, em alguns casos, como o chrome, é implementado um buscador parecido com a jQuery, que faz a busca sobre os elementos da páginas mas não retorna a mesma coisa, retorna um objeto HTMLDocument (aquele encontrado na mensagem de erro). Recomendo você fazer algo parecido com isto: (function ($) { $(document).ready(function() { // ... aqui de fato vem a implementação } })(jQuery); Veja que você cria uma função anônima que recebe como argumento o $ e instantaneamente executa essa função passando como parâmetro a jQuery, que a partir de agora passa a ser o $. Existem outras abordagens que a própria jquery recomenda. Leia a documentação ;-) Qualquer coisa, grita!
  4. Michael Granados

    Exportação de dados do portal governo transparente

    Desculpa, eu não entendi bem a pergunta mas acredito que você queira algo como... <style> .wrapper .table { border-collapse: collapse; } .wrapper .table .table-header th { font-weight: bold; border: 1px solid silver; background: #eee; } .wrapper .table .table-body td { border: 1px solid silver; } </style> <div id="wrapper" class="wrapper"></div> <!-- estes scripts são polifills para que as Promises (then, catch) e o método fetch funcionem em navegadores mais antigos --> <script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/3.0.0/fetch.min.js"></script> <script> (function () { // utilizado para isolar as variáveis e não causar problemas de segurança futuros var url = 'https://www.governotransparente.com.br/transparencia/api/v1/json/remessas/1194487'; var resultWrapper = document.getElementById('wrapper'); // aqui fica a requisição e as ações sobre cada uma delas fetch(url) .then(checkServerResponse) .then(toJSON) .then(createTable) ['catch'](showErrorMessage); // caso aconteça algum erro em qualquer uma das ações anteriores, faça o tratamento de erros ;-) // tratamento de erros function showErrorMessage(err) { resultWrapper.innerHTML = '<pre>Erro:\r' + err.toString() + '</pre>'; } // verifica se a resposta do servidor foi um sucesso function checkServerResponse(res) { if (res.ok) { return res; } throw new Error('Unable to fetch data from server. Status: ' + res.status); } // tenta converter a resposta do servidor em objeto json manipulável ao invés de texto puro function toJSON(res) { return res.json(); } // converte os dados em tabela e insere no resultWrapper function createTable(data) { var heads = Object.keys(data).map(function (item) { return '<th>' + item + '</th>'; }).join(''); var contents = Object.values(data).map(function (item) { return '<td>' + item + '</td>'; }).join(''); resultWrapper.innerHTML = [ '<table class="table">', '<thead class="table-header">', '<tr>', heads, '</tr>', '</thead>', '<tbody class="table-body">', '<tr>', contents, '</tr>', '</tbody>', '</table>', ].join(''); } }); </script> Você pode ver o código funcionando aqui: https://jsfiddle.net/gkezhv85/5/ Tomei a liberdade de fazer um código mais moderno, não utilizando jQuery e utilizando funcionalidades que os navegadores mais modernos já utilizam como o fetch e as Promises, o que faz o código ficar, na miha opinião, mais organizado, já que cada ação fica em uma função isolada. Também optei por fazer dessa maneira para instigar os estudos do pessoal aqui no fórum... espero ter ajudado, qualquer coisa dá um grito :-D
  5. Michael Granados

    Salvar dados dos Inputs clonados pelo OnClick

    Se um dia você quiser adicionar um botão de remover o material, a lógica do seu script pode falhar. Recomendo deixar o contador de fora, assim como você fez com o elm_html e incrementá-lo separadamente... $(document).ready(function(){ var elm_html = $('.pedido').html(); //faz uma cópia dos elementos a serem clonados. var counter = 0; $(document).on('click', '.clonador', function(e){ e.preventDefault(); var elementos = elm_html.replace(/\[[0\]]\]/g, '[' + counter +']'); //substitui o valor dos index counter++; // incrementa o contador $('#cadastro').append(elementos); //exibe o clone. }); }); Ah, e o removedor... é claro... <div class="pedido"> { ... } <button type="button" class="removedor">remover</button> </div> <script> $(document).on('click', '.removedor', function (event) { event.preventDefault(); $(this).parents('.pedido').remove(); // navega até o pai com a classe pedido e remove ele inteiro }); </script> Quando ao fato de chegar a informação no seu servidor com possibilidade de números faltando na chave, abstraia... você pode utilizar o foreach($_POST['material'] as $key => $value) do php para saber o que está chegando, onde o $key é a chave que você vai utilizar para saber o $_POST['quantidade'][$key] que você precisa. ;-)
  6. Michael Granados

    Capturar click no anúncios dentro do meu site

    Isto acontece por causa de como o anúncio é montado. A maioria das empresas de publicidade montam os anúncios dentro de um iframe o que significa que o anúncio está em outra página, e dentro dela todo o conteúdo do anínco que varia de um HTML com apenas textos, imagens e links até páginas complexas com React ou até mesmo flash. Basicamente você está deixando uma "janela" aberta para outro site exibir o anúncio. Li o script que está no link que você passou e pude comprovar a existencia do tal iframe: Segue a transcrição (apaguei alguns caracteres da linha para ficar legível)... var content = '<iframe width="300" [...] src="'+ url +'" scrolling="no"></iframe>'; Dessa forma, os eventos (de click por exemplo) precisam ser anexados nessa página onde está apontando o iframe. Geralmente isso não vai ser possível por segurança interdomínios, o próprio navegador barra essa possibilidade. Ainda bem que existe essa proteção, já pensou se um anúncio malicioso pudesse resgatar as chaves de segurança nos cookies dos seus usuários? Existe um arquivo chamado crossdomain.xml que o servidor da página de destino pode adicionar permitindo que os scripts de outros domínios possam "entrar" na página, mas acho muito pouco provavel que qualquer empresa de publicidade abra essa brecha de segurança e confiar que o seu site ou o de terceiros possa nunca sofrer um ataque ;-) Referencias/Recomendações sobre segurança: http://blog.securelayer7.net/owasp-top-10-security-misconfiguration-5-cors-vulnerability-patch/ https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md https://code.tutsplus.com/tutorials/quick-tip-a-guide-to-cross-domain-policy-files--active-3832
  7. Michael Granados

    Enviar IDs selecionados checkBox

    O que aparece no script que você está fazendo o POST via AJAX? Você pode verificar isso escrevendo o seguinte código em PHP. <pre><?php var_dump($_POST); ?></pre> Aparentemente o código está correto... eu só usaria .map ao invés de .each e removeria a seguinte referência pois ela é redundante... $(document).ready(function() { ... e consequentemente, o fechamento da chamada também...
  8. Michael Granados

    Salvar dados dos Inputs clonados pelo OnClick

    Pelo que entendi, você quer que o usuário possa te enviar um pedido com vários materiais e um valor para cada um deles, certo? Algo como.... <?php $dados = array( 'materiais' => array( 1 => 'cimento', 2 => 'tijolo', ), 'quantidades' => array( 1 => '21', 2 => '200', ), ); ?> Ou ainda... para ficar mais fácil... <?php $dados = array( 1 => array( 'produto' => 'cimento', 'quantidade' => '200', ), 2 => array 'produto' => 'tijolo', 'quantidade' => '400', ), ); ?>
  9. Michael Granados

    Função valida data

    Essa caracteristica que você deseja se resolve facilmente colocando um condicional no começo da função, validando o campo caso ele esteja vazio: function VerificaData(digData) { // verifica se o campo está vazio if (!digData) { return true; } var bissexto = 0; var data = digData; ... }
  10. Michael Granados

    Iniciar script depois de um tempo pré-definido

    Olá @vmdev, Sua dúvida me intrigou e aceitei o desafio de fazer uma função que fizesse o que você quer fazer. Tentei fazer isso quando comecei a programar e tive muitos problemas na epoca que acabei deixando o problema de lado e desisti do efeito. Pensei comigo, afinal de contas... tem essa biblioteca nova aqui... script.aculo.us que faz efeitos melhores, vou experimentar... (só quem é velho vai lembrar, rsss...) O interessante nesse exercicio é quebrar os caracteres e fazê-los aparecer um a um em seu determinado tempo. Vi que no seu código você tentou isso utilizando o forEach aliado ao setTimeout. O problema dessa abordagem é que o forEach não vai esperar um timeout terminar para começar o outro... como pode ser visto no exemplo abaixo: https://jsbin.com/vexozohaca/1/edit?js,console Então comecei a pensar em programação funcional, onde a mesma função acaba se chamando várias vezes e aproveitando o poder de processamento de dados devido a sua imutabilidade. Veja um exemplo bem simples do que estou falando... function fatorial(numero) { if (numero <= 0) { return 1; } return numero * fatorial(numero - 1); } fatorial(5); // => 120 Perceba como o método fatorial chama ele mesmo e tem um breakpoint no começo para ele não se chamar infinitamente. Mas chega de conceitos e vamos tentar aplicar isso ao seu problema... function typewriter(texto, current) { if (!texto) { return; } alert((current || '') + texto[0]); typewriter(texto.substr(1), (current || '') + texto[0]); } Perceba como fazemos a função se chamar e para quando for o texto terminar. Agora, vamos incrementar isso com um timeout que será chamado. function typewriter(texto, current) { if (!texto) { return; } alert((current || '') + texto[0]); setTimeout(function () { typewriter(texto.substr(1), (current || '') + texto[0]); }, 200); } E se a gente puder parametrizar esse tempo? Seria bacana, né? function typewriter(texto, tempo, current) { if (!texto) { return; } alert((current || '') + texto[0]); setTimeout(function () { typewriter(texto.substr(1), tempo, (current || '') + texto[0]); }, tempo); } typewriter('meu texto', 1000); Boa, tudo funciona conforme o combinado, ele chama o setTimeout no final de cada chamada, não encavalando chamadas setTimeout e podemos manipular a velocidade da mensagem... Perceba que o tempo foi adicionado em três lugares, na declaração da função, na chamada da mesma dentro do setTimeout e no final do setTimeout. Agora, vamos focar naquele alert, que é onde se concentra a lógica do programa, seria interessante se a gente chamasse uma closure ou função anônima, assim como fizemos no setTimeout. Assim a gente pode definir um método para cada um de forma diferente... function typewriter(texto, tempo, acao, current) { if (!texto) { return; } if (acao) { acao((current || '') + texto[0]); } setTimeout(function () { typewriter(texto.substr(1), tempo, acao, (current || '') + texto[0]); }, tempo); } typewriter('pipoca', 1000, function (texto) { alert("[" + texto.split('').join('][') + "]"); }); De novo, o argumento acao precisou ser adicionado em três lugares. Na declaração e na chamada do typewriter e na chamada, onde substituimos o alert. Aproveitei para adicionar uma verificação de se a acao existir... aqui dá pra implementar métodos de verificar se é uma função, se ele é chamável, etc... vamos nos atentar ao desafio... Por último, precisamos fazer um callback que será executado quando a função terminar, assim podemos fazer o seu h2 executar somente quando terminar o outro... function typewriter(texto, tempo, acao, callback, current) { if (!texto) { if (callback) { /* novo */ callback(); /* novo */ } /* novo */ return; } if (acao) { acao((current || '') + texto[0]); } setTimeout(function () { typewriter(texto.substr(1), tempo, acao, callback /* novo */, (current || '') + texto[0]); }, tempo); } typewriter( 'pipoca', // texto a ser utilizado 1000, // tempo entre iteracoes function (texto) { // funcao que sera executada a cada iteracao alert("[" + texto.split('').join('][') + "]"); }, function () { // funcao que será chamada no final de tudo alert("fim da transmissão"); } ); Como está começando a ficar um pouquinho confuso, coloquei os comentários para ajudar a entender onde entra o callback e a chamada da typewriter no final... Bom, com isso já podemos utilizar nossa função a nosso favor... https://jsbin.com/tamuzivulo/1/edit?html,js,output <html> <head> <meta charset="UTF-8"> <title>Typewriter</title> </head> <body> <h1 id="h1">Teste simples</h1> <h2 id="h2">Sequencia de caracteres</h2> <script> function typewriter(texto, tempo, acao, callback, current) { if (!texto) { if (callback) { callback(); } return; } if (acao) { acao((current || '') + texto[0]); } setTimeout(function () { typewriter(texto.substr(1), tempo, acao, callback /* novo */, (current || '') + texto[0]); }, tempo); } var h1 = document.getElementById('h1'); var h2 = document.getElementById('h2'); var h1Text = h1.innerText; h1.innerText = ''; var h2Text = h2.innerText; h2.innerText = ''; typewriter( h1Text, 75, function (text) { h1.innerText = text }, function () { typewriter( h2Text, 100, function (text) { h2.innerText = '[' + text.split('').join('][') + ']'; } ); } ); </script> </body> </html> Só desculpa pelo texto grande, mas acabei me empolgando. Espero que tenha ajudado nos seus estudos. Qualquer coisa, grita.
  11. Michael Granados

    Alerta ao pressionar arroba

    Eu não testei, mas tenta utilizar addEventListener ao invés de onKeyUp direto no elemento. Tem um exemplo bem aqui... https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
  12. Michael Granados

    Virgula após número

    Eu particularmente prefiro utilizar arrays para o propósito... <?php function exibircod($cod, $busca) { // $num_linhas = mysqli_num_rows($busca); // $i = 1; $items = array(); while ($assocfunc = mysqli_fetch_assoc($busca)) { $items[] = $assocfunc[$cod]; } echo "delete from produto where CodProd in(" . implode(", ", $items) . ");"; }
  13. Michael Granados

    Alerta ao pressionar arroba

    Precisa ajustar dois pontos: No HTML, é necessário informar que você passará o evento para a função... <input onKeyPress="TeclaArroba(event)" /> No javascript, o mesmo deverá receber o evento para a devida tratativa. function TeclaArroba(event) { if (event.keyCode === 64) { alert(event.keyCode); } } Abraços!
  14. Michael Granados

    push notification feed rss

    Eu não estudei o push notification do google chrome, mas acho que é um pouco mais complicado que isso... parece que precisa que exista um servidor de fato enviando notificações, talvez o Firebase do google possa fazer isso de graça, mas não tenho certeza. Dá uma olhada no artigo lá no artigo do google explicado o passo a passo de como fazer... se alguém tiver um post BR-HUE-HUE será bem-vindo :-) https://developers.google.com/web/fundamentals/codelabs/push-notifications/ Aqui tem um outro, mais antigo, que implementa com o Firebase... https://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web
  15. Michael Granados

    AJAX não executa função

    Quando você faz uma requisição o que acontece é algo parecido com isto: Requisição: > POST /login.php > > usuario=alexandre&senha=pipoca Resposta: < 301 Found < Location: /teste A partir desse código, primeiros bytes enviados pelo servidor o navegador descobre que o usuário precisará ser redirecionado para o cabeçalho descrito pelo Location. Você pode ver isso no chrome ou firefox abrindo a aba de rede/network do Developer Tools, apertando CTRL+SHIFT+i na página. Abaixo, um exemplo de uma aplicação web que estou trabalhando neste momento no google chrome developer tools. Onde podemos ver o Status Code: 302 Found respondido pelo servidor. Veja que o servidor responde que a resposta é um redirecionamento, mas como você está executando isso dentro de um "navegador virtual" via AJAX, o mesmo não sabe o que fazer com isso. O processo fica um pouco diferente se você enviar um corpo, como o @ShadowDLL mencionou... Requisição: > POST /login.php > > usuario=michael&senha=p0pc0Rn Resposta: < 200 OK < Content-Type: application/json < < {"inserted":true} A partir daí, o javascript vai conseguir entender que foi enviado uma notação json, veja o cabeçalho Content-Type e um corpo (separado por uma linha em branco) com o JSON propriamente dito. Para fazer isso com PHP você escreverá da seguinte forma: <?php $inserted = $a->insert(); // aqui fica o seu código que faz a insercao no banco de dados e verifica a mesma header('Content-Type: application/json'); echo json_encode(array( "inserted" => $inserted, )); Para o javascript você vai fazer algo parecido com isto: $.post( '/enviaAssinatura.php', { usuario: 'monica' }, function (data) { // isto executará quando o servidor responder com sucesso, obirgado jQuery alert(data.inserted); } ); O @ShadowDLL mencionou fazer o redirecionamento utilizando o window.location, deixe sua imaginação te levar :-) Espero ter ajudado, e que a força esteja com você.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.