Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    18

    Tooltips: problema con setTimeout() e clearTimeout()

    Ciao a tutti!
    Ho scaricato da qualche giorno un javascript gratuito per creare dei tooltips dinamicamente e popolati con ajax. Lo script originario non prevede la possibilità di mantenere visibili i tooltips quando il mouse è sopra il tooltip stesso, cosa che invece a me interessa, visto che vorrei poter inserire dei link all'interno. Così ho provato a modificare lo script di base aggiungendo un setTimeout() e dei clearTimeout() in punti opporutni, almeno secondo me, ma purtroppo non conosco molto bene javascript...
    Pensavo di aver trovato la soluzione, visto che in Firefox e Opera tutto funziona come vorrei, ma purtroppo in Internet Explorer (6 e 7) non funziona! Sembra che il timeout proceda e che il cleartimeout venga totalmente ignorato... Dove sbaglio? C'è forse qualche particolare differenza di istruzioni da utilizzare con i browser di Microsoft??
    Vi inserisco il codice: è un po' disordinato perchè ci ho pasticciato un bel po' tentando varie diverse soluzioni (molte delle quali funzionano sempre in Firefox e Opera e non in IE!!).

    Vi ringrazio per l'aiuto che potrete darmi.
    Ciao

    codice:
    /************************************************************************************************************
    Ajax tooltip
    Copyright (C) 2006  DTHMLGoodies.com, Alf Magne Kalleland
    
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.
    
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
    
    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    
    Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
    written by Alf Magne Kalleland.
    
    Alf Magne Kalleland, 2006
    Owner of DHTMLgoodies.com
    	
    ************************************************************************************************************/	
    
    /* Custom variables */
    /* Offset position of tooltip */
    var x_offset_tooltip = 5;
    var y_offset_tooltip = 0;
    
    /* Don't change anything below here */
    var ajax_tooltipObj = false;
    var ajax_tooltipObj_iframe = false;
    var timer;
    
    var ajax_tooltip_MSIE = false;
    if(navigator.userAgent.indexOf('MSIE')>=0)ajax_tooltip_MSIE=true;
    
    function ajax_showTooltip(externalFile,inputObj) {
      clearTimeout(timer);
      if(!ajax_tooltipObj) {
        /* Tooltip div not created yet ? */
        ajax_tooltipObj = document.createElement('DIV');
        ajax_tooltipObj.style.position = 'absolute';
        //ajax_tooltipObj.setAttribute('onmouseover', 'clearTimeout(timer)');
        ajax_tooltipObj.setAttribute('onmouseover', 'keep_tooltip()');
        ajax_tooltipObj.setAttribute('onmouseout', 'ajax_hideTooltip()');
        ajax_tooltipObj.id = 'ajax_tooltipObj';
        document.body.appendChild(ajax_tooltipObj);
        
        var leftDiv = document.createElement('DIV');	/* Create arrow div */
        leftDiv.className='ajax_tooltip_arrow';
        leftDiv.id = 'ajax_tooltip_arrow';
        ajax_tooltipObj.appendChild(leftDiv);
        
        var contentDiv = document.createElement('DIV'); /* Create tooltip content div */
        contentDiv.className = 'ajax_tooltip_content';
        ajax_tooltipObj.appendChild(contentDiv);
        contentDiv.id = 'ajax_tooltip_content';
        
        if(ajax_tooltip_MSIE) { /* Create iframe object for MSIE in order to make the tooltip cover select boxes */
          ajax_tooltipObj_iframe = document.createElement('<IFRAME frameborder="0">');
          ajax_tooltipObj_iframe.style.position = 'absolute';
          ajax_tooltipObj_iframe.border='0';
          ajax_tooltipObj_iframe.frameborder=0;
          ajax_tooltipObj_iframe.style.backgroundColor='#FFF';
          ajax_tooltipObj_iframe.src = 'about:blank';
          //ajax_tooltipObj_iframe.setAttribute('onmouseover', 'clearTimeout(timer)');
          ajax_tooltipObj_iframe.setAttribute('onmouseover', 'keep_tooltip()');
          ajax_tooltipObj_iframe.setAttribute('onmouseout', 'ajax_hideTooltip()');
          contentDiv.appendChild(ajax_tooltipObj_iframe);
          ajax_tooltipObj_iframe.style.left = '0px';
          ajax_tooltipObj_iframe.style.top = '0px';
        }
      }
      // Find position of tooltip
      ajax_tooltipObj.style.display='block';
      ajax_loadContent('ajax_tooltip_content',externalFile);
      if(ajax_tooltip_MSIE){
        ajax_tooltipObj_iframe.style.width = ajax_tooltipObj.clientWidth + 'px';
        ajax_tooltipObj_iframe.style.height = ajax_tooltipObj.clientHeight + 'px';
      }
      ajax_positionTooltip(inputObj);
    }
    
    function ajax_positionTooltip(inputObj) {
      var leftPos = (ajaxTooltip_getLeftPos(inputObj) + inputObj.offsetWidth);
      var topPos = ajaxTooltip_getTopPos(inputObj);
      var tooltipWidth = document.getElementById('ajax_tooltip_content').offsetWidth +  document.getElementById('ajax_tooltip_arrow').offsetWidth; 
      ajax_tooltipObj.style.left = leftPos + 'px';
      ajax_tooltipObj.style.top = topPos + 'px';
    }
    
    function keep_tooltip() { clearTimeout(timer); document.getElementById('ajax_tooltipObj').style.display="block"; }
    function ajax_hideTooltip() { timer = setTimeout('ajax_tooltipObj.style.display=\'none\'',1000); }
    
    function ajaxTooltip_getTopPos(inputObj) {
      var returnValue = inputObj.offsetTop;
      while((inputObj = inputObj.offsetParent) != null) {
        if(inputObj.tagName!='HTML')returnValue += inputObj.offsetTop;
      }
      return returnValue;
    }
    
    function ajaxTooltip_getLeftPos(inputObj) {
      var returnValue = inputObj.offsetLeft;
      while((inputObj = inputObj.offsetParent) != null){
        if(inputObj.tagName!='HTML')returnValue += inputObj.offsetLeft;
      }
      return returnValue;
    }
    Questo è invece il codice con cui attivo il tooltip

    codice:
    ToolTip

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    18
    Nessuno sa darmi qualche indicazione??
    Non pretendo certo che mirisolviate il problema, ma almeno che mi indichiate dove sto sbagliando...

    Grazie

  3. #3
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    questa riga e le simili sono sbagliate, i gestrori evento non sono attributi

    ajax_tooltipObj_iframe.setAttribute('onmouseover', 'keep_tooltip()');

    ajax_tooltipObj_iframe.onmouseover=keep_tooltip;

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    18
    Grazie mille Xinod!
    Era proprio lì il problema! Ora funziona tutto correttamente!

    Inizialmente avevo scritto il codice proprio come me l'hai indicato, ma con questa piccola differenza:

    ajax_tooltipObj_iframe.onmouseover=keep_tooltip();

    (le parentesi) che però bloccavano lo script! Pensavo quindi che fosse sbagliato il metodo...

    Ma se il codice effettivamente era sbagliato, perchè in Opera e FireFox tutto funzionava comunque? Forse questi due browser non seguono lo standard alla lettera e, diciamo, "capiscono" il codice anche se errato? Di solito è IE a comportarsi così!

    Grazie ancora!
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.