Avatar billede ferrari_brian Nybegynder
29. august 2006 - 13:03 Der er 46 kommentarer og
1 løsning

script virker ikke i firefox, men virker i opera og IE

Hej alle...

Jeg har fået lavet et lille script der minder meget om det der er i phpmyadmin... og har da også kigget lidt til koden heri.

Men mit problem er at det ikke virker i firefox, eller det vil sige at den kan sagtens bruge hover, men ikke markere rækken, og dermed heller ikke udføre getContent(), men en alert('test') virker heller ikke og getContent() virker hvis det ikke er denne funktion, så det er ikke getContent det er galt med (getContent er et "AJAX" script). Desuden ville jeg også gerne have at når en række var markeret, og jeg markerede en anden linie, så blev den foregående række "afmarkeret" igen, således at der kun er 1 linie markeret ad gangen... her er koden:

var Marked = new Array;

function markRows()
{

  var rows = document.getElementsByTagName('tr');
  for ( var i = 0; i < rows.length; i++ )
  {

    if ( 'odd' != rows[i].className.substr(0,3) && 'even' != rows[i].className.substr(0,4) )
    {
      continue;
    }

    if ( navigator.appName == 'Microsoft Internet Explorer' )
    {
      // but only for IE, other browsers are handled by :hover in css
      rows[i].onmouseover = function()
      {
        this.className += ' hover';
      }
      rows[i].onmouseout = function()
      {
        this.className = this.className.replace( ' hover', '' );
      }
    }

    rows[i].onmousedown = function()
    {
      var unique_id;
      var row;

      row = this.getElementsByTagName( 'input' )[0];
      if ( row && row.type == 'hidden' )
      {
        unique_id = row.value;
      }
      else if ( this.id.length > 0 )
      {
        unique_id = this.id;
      }
      else
      {
        return;
      }

      if ( typeof(Marked[unique_id]) == 'undefined' || !Marked[unique_id] )
      {
        Marked[unique_id] = true;
      }
      else
      {
        Marked[unique_id] = false;
      }

      if ( Marked[unique_id] )
      {
        this.className += ' marked';
        getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
      }
      else
      {
        this.className = this.className.replace(' marked', '');
        document.getElementById('SelectMenu').innerHTML = '';
      }
    }
  }
}
window.onload=markRows;
Avatar billede ferrari_brian Nybegynder
29. august 2006 - 13:10 #1
koden hvor den bliver brugt i en tabel er:

for ($i = 0; $i < sizeof($Array); $i++)
{
  extract($Array[$i]);
  $cls = ($i%2 == 0)? "odd":"even";
  echo "
    <tr class='$cls'>
      <input type='hidden' name='$Id' value='$Id' id='$Id'>
      <td class='listlink'> <label for='$Id'> $A  </label></td>
      <td class='listlink'> <label for='$Id'> $B  </label></td>
      <td class='listlink'> <label for='$Id'> $C  </label></td>
      <td class='listlink'> <label for='$Id'> $D  </label></td>
      <td class='listlink'> <label for='$Id'> $E  </label></td>
      <td class='listlink'> <label for='$Id'> $F  </label></td>
      <td class='listlink'> <label for='$Id'> $G  </label></td>
    </tr>
    ";
}

$Array er resultatet fra et MySQL kald (betyder sådan set ikke noget her).
$cls gør at man kan lave skiftevis forskellige farver på rækkerne (betyder her intet).
$Id er unique_id i scriptet, og angiver dermed id for denne række.
Avatar billede softspot Forsker
29. august 2006 - 13:45 #2
Prøv evt. at benytte getAttribute("class") for FF i stedet for className. Jeg ved ikke om du kan undgå at benytte .className for IE, så det kan være du skal lave koden lidt om så du håndtere begge alle browsertyper. Du kan evt. lave en funktion som tager et objekt og returnerer class for det objekt.

function getClassName(obj) {
  if(typeof obj.className == "undefined")
    return obj.getAttribute("class");
  else
    return obj.className;
}
Avatar billede ferrari_brian Nybegynder
29. august 2006 - 13:52 #3
den nævnte phpmyadmin bruger ovenstående script, med className, så det burde ikke være det, men jeg kan da prøve... evt kan phpmyadmin downloades, og i mappen er der en mappe der hedder js og inde i den er det i function.js de også bruger ovenstående, den hedder bare PMA_markRowsInit
Avatar billede ferrari_brian Nybegynder
29. august 2006 - 14:00 #4
jeg har nu afprøvet getAttribute("class") og det resulterede i at det ikke virkede i nogen af browserne
Avatar billede softspot Forsker
29. august 2006 - 14:05 #5
Hvordan så din kode ud efter du benyttede getAttribute (kan du prøve at paste den ind her)?
Avatar billede ferrari_brian Nybegynder
29. august 2006 - 14:08 #6
jeg erstattede className med getAttribute(\"class\")

IE gav selvfølgelig fejl, hvorimod Opera og FF ikke gjorde noget som helst
Avatar billede softspot Forsker
29. august 2006 - 14:13 #7
Prøv lige at paste hele koden. Du skal f.eks. ikke bruge backslash i kaldet til metoden (getAttribute(\"class\") skal være getAtribute("class")), det kan være derfor FF ikke gør noget (den fejler i stilhed - du kan dog hente javascript-console frem via menuen og se hvad den brokker sig over).
Avatar billede softspot Forsker
29. august 2006 - 14:21 #8
Det jeg ville have foreslået (som jeg nok bare burde have gjort fra starten) var flg.:

var Marked = new Array;

function markRows()
{

  var rows = document.getElementsByTagName('tr');
  for ( var i = 0; i < rows.length; i++ )
  {

    if ( 'odd' != getClassName(rows[i]).substr(0,3) && 'even' != getClassName(rows[i]).substr(0,4) )
    {
      continue;
    }

    if ( navigator.appName == 'Microsoft Internet Explorer' )
    {
      // but only for IE, other browsers are handled by :hover in css
      rows[i].onmouseover = function()
      {
        setClassName(this, getClassName(this) + ' hover');
      }
      rows[i].onmouseout = function()
      {
        setClassName(this, getClassName(this).replace( ' hover', '' ));
      }
    }

    rows[i].onmousedown = function()
    {
      var unique_id;
      var row;

      row = this.getElementsByTagName( 'input' )[0];
      if ( row && row.type == 'hidden' )
      {
        unique_id = row.value;
      }
      else if ( this.id.length > 0 )
      {
        unique_id = this.id;
      }
      else
      {
        return;
      }

      if ( typeof(Marked[unique_id]) == 'undefined' || !Marked[unique_id] )
      {
        Marked[unique_id] = true;
      }
      else
      {
        Marked[unique_id] = false;
      }

      if ( Marked[unique_id] )
      {
        setClassName(this,getClassName(this) + ' marked');
        getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
      }
      else
      {
        setClassName(this, getClassName(this).replace(' marked', ''));
        document.getElementById('SelectMenu').innerHTML = '';
      }
    }
  }
}
window.onload=markRows;

function getClassName(obj) {
  if(typeof obj.className == "undefined")
    return obj.getAttribute("class");
  else
    return obj.className;
}

function setClassName(obj, value) {
  if(typeof obj.className == "undefined")
    obj.setAttribute("class", value);
  else
    obj.className = value;
}
Avatar billede ferrari_brian Nybegynder
29. august 2006 - 14:27 #9
det var ikke det der skulle til, men jeg prøvede at sætte nogle alerts ind i koden, og den opfylder ikke nogen af de 2 if-statements i onmousedown-funktionen hvor den dør i:

if ( row && row.type == 'hidden' )
      {
        unique_id = row.value;
      }
      else if ( this.id.length > 0 )
      {
        unique_id = this.id;
      }
      else
      {
        return; // her går den ind og dør dermed... dvs der er noget med row og/eller Id
      }
Avatar billede softspot Forsker
29. august 2006 - 14:42 #10
Hmm... jeg synes jeg har hørt om en forskel på håndteringen af id i DOM'en (ligesom den med className, men jeg kan ikke huske hvordan det var - jeg synes bare det var noget med at IE håndterede det forskelligt fra de andre).
Avatar billede olebole Juniormester
29. august 2006 - 14:55 #11
<ole>

Under XHTML skal man under alle omstændigheder bruge 'getAttribute' og 'setAttribute'. Det er man med andre ord nødt til at gøre med 'class' i FF og 'className' i IE.
Det gælder i øvrigt alle attributter - f.eks. også 'id' - at de to metoder skal benyttes. Dette holder således ikke:
    alert(ELEMENT.id)

På W3C ligger en udmærket tråd om emnet 'class' contra 'className'. Den begynder her:
    http://lists.w3.org/Archives/Public/www-dom/2000OctDec/0173.html
   

/mvh
</bole>
Avatar billede ferrari_brian Nybegynder
29. august 2006 - 15:05 #12
hej olebole... det du skriver er at jeg skal bruge getAttribute for at få det til at virke, men hvordan vil det i mit tilfælde virke?
Avatar billede softspot Forsker
29. august 2006 - 15:09 #13
Jeg vil gætte på noget i denne stil:

var Marked = new Array;

function markRows()
{

  var rows = document.getElementsByTagName('tr');
  for ( var i = 0; i < rows.length; i++ )
  {

    if ( 'odd' != getClassName(rows[i]).substr(0,3) && 'even' != getClassName(rows[i]).substr(0,4) )
    {
      continue;
    }

    if ( navigator.appName == 'Microsoft Internet Explorer' )
    {
      // but only for IE, other browsers are handled by :hover in css
      rows[i].onmouseover = function()
      {
        setClassName(this, getClassName(this) + ' hover');
      }
      rows[i].onmouseout = function()
      {
        setClassName(this, getClassName(this).replace( ' hover', '' ));
      }
    }

    rows[i].onmousedown = function()
    {
      var unique_id;
      var row;

      row = this.getElementsByTagName( 'input' )[0];
      if ( row && row.type == 'hidden' )
      {
        unique_id = row.value;
      }
      else if ( this.getAttribute("id").length > 0 )
      {
        unique_id = this.getAttribute("id");
      }
      else
      {
        return;
      }

      if ( typeof(Marked[unique_id]) == 'undefined' || !Marked[unique_id] )
      {
        Marked[unique_id] = true;
      }
      else
      {
        Marked[unique_id] = false;
      }

      if ( Marked[unique_id] )
      {
        setClassName(this,getClassName(this) + ' marked');
        getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
      }
      else
      {
        setClassName(this, getClassName(this).replace(' marked', ''));
        document.getElementById('SelectMenu').innerHTML = '';
      }
    }
  }
}
window.onload=markRows;

function getClassName(obj) {
  if(typeof obj.className == "undefined")
    return obj.getAttribute("class");
  else
    return obj.getAttribute("className");
}

function setClassName(obj, value) {
  if(typeof obj.className == "undefined")
    obj.setAttribute("class", value);
  else
    obj.setAttribute("className", value);
}
Avatar billede olebole Juniormester
29. august 2006 - 15:26 #14
Du bliver nødt til at lave et browser-check og bruge det i 'getClassName'. Dette går ikke under X(HT)ML:
    if(typeof obj.className == "undefined")

Husk i den forbindelse, at også Opera opfylder betingelsen:
  if ( navigator.appName == 'Microsoft Internet Explorer' )

I stedet kan du bruge:
    var uA = navigator.userAgent.toLowerCase();
    if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1)
Avatar billede olebole Juniormester
29. august 2006 - 15:32 #15
- men det er så helt afgjort noget gede-rod (hvordan opfører f.eks. de andre browsere sig - og hvorlænge opfører FF og IE sig, som de gør idag?)  :o|

Mit råd er som vanligt:
    Vent med at skrive XHTML, til WWW (incl. vore browsere) er kompatibelt med teknologien ... og det er jo langtfra tilfældet endnu ... og det sker ikke foreløbigt  ;o)
Avatar billede ferrari_brian Nybegynder
29. august 2006 - 15:34 #16
dvs du mener ikke at det kan lade sig gøre at lave det så det virker? trods det at phpmyadmin har lavet det og det virker?

softspot... jeg har siddet og rodet i det du skrev, men det virker ikke, det får bare Opera ud af funktion også ...
Avatar billede softspot Forsker
29. august 2006 - 15:40 #17
Nå, men så er det da i det mindste konsekvent ;-)

Anyway! Jeg kan ikke lige se hvorfor det ikke fungerer - hvis ellers du har rettet det som olebole nævnte i de to get-/setClassName-funktioner, altså:

var uA = navigator.userAgent.toLowerCase();
   
function getClassName(obj) {
  if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1)
    return obj.getAttribute("className");
  else
    return obj.getAttribute("class");
}

function setClassName(obj, value) {
  if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1)
    obj.setAttribute("className", value);
  else
    obj.setAttribute("class", value);
}
Avatar billede ferrari_brian Nybegynder
29. august 2006 - 15:43 #18
det gør ingen forskel ... det virker stadig kun i IE
Avatar billede softspot Forsker
29. august 2006 - 16:14 #19
Nu har jeg lige forsøgt mig med et lille eksempel, og det ser ud til at fungere med både IE og FF (når hover-stylen bliver lavet i FF). Det er godt nok med en HTML 4.01 DOCTYPE, men set i lyset af det som olebole siger, så er det måske også bedre...(?)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- Minus AutoDato -->
<title>Titel</title>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<style type="text/css" rel="stylesheet">
  .even { background-color: white; }
  .odd { background-color: #efefef; }
  tr:hover, .hover { background-color: blue; }
  .marked { background-color: lightblue; }
</style>
<script type="text/javascript">
  var Marked = new Array;
  var uA = navigator.userAgent.toLowerCase();
     
  function markRows()
  {

    var rows = document.getElementsByTagName('tr');
    for ( var i = 0; i < rows.length; i++ )
    {

      if ( 'odd' != getClassName(rows[i]).substr(0,3) && 'even' != getClassName(rows[i]).substr(0,4) ) {
        continue;
      }

      if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1)
      {
        // but only for IE, other browsers are handled by :hover in css
        rows[i].onmouseover = function() { setClassName(this, getClassName(this) + ' hover'); }
        rows[i].onmouseout  = function() { setClassName(this, getClassName(this).replace( ' hover', '' )); }
      }

      rows[i].onmousedown = function() {
        var unique_id;
        var row;

        row = this.getElementsByTagName( 'input' )[0];
        if ( row && row.type == 'hidden' ) {
          unique_id = row.value;
        }
        else if ( this.getAttribute("id").length > 0 ) {
          unique_id = this.getAttribute("id");
        }
        else {
          return;
        }

        if ( typeof(Marked[unique_id]) == 'undefined' || !Marked[unique_id] ) {
          Marked[unique_id] = true;
        }
        else {
          Marked[unique_id] = false;
        }

        if ( Marked[unique_id] ) {
          setClassName(this,getClassName(this) + ' marked');
          getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
        }
        else {
          setClassName(this, getClassName(this).replace(' marked', ''));
          document.getElementById('SelectMenu').innerHTML = '';
        }
      }
    }
  }
  window.onload=markRows;

  function getClassName(obj) {
    if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1) {
      return obj.className;
      return obj.getAttribute("className");
    }
    else {
      return obj.getAttribute("class");
    }
  }

  function setClassName(obj, value) {
    if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1) {
      obj.className = value;
      //obj.setAttribute("className", value);
    }
    else {
      obj.setAttribute("class", value);
    }
  }
</script>
</head>

<body>

<table>
  <tr class="odd">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="even">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="odd">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="even">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="odd">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="even">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
</table>
</body>
</html>
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 08:28 #20
tak for svarene, men det virker stadig ikke ... det er stadig den som jeg selv har postet der virker, i Opera og IE, de andre virker kun i IE
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 08:29 #21
dvs ingen der virker i FF
Avatar billede softspot Forsker
30. august 2006 - 08:37 #22
OK, men det kode jeg viste i mit sidste indlæg fungerede i FF 1.0 og IE 6.0, så det er fordi der så er noget ved den kode som du ikke bruger (og det er fair nok, men kan du i det mindste fortælle hvad forskellen på din og min kode er? - så bliver det lidt lettere at hjælpe dig...).
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 09:04 #23
jeg prøvede med din kode som helhed. lige sådan som du skrev den, og det virkede ikke ... men jeg bruger så også FF 1.5.0.6
Avatar billede softspot Forsker
30. august 2006 - 09:33 #24
Hvad er det helt præcis der ikke fungerer?
Avatar billede softspot Forsker
30. august 2006 - 09:34 #25
Og kan du ikke også give et par eksempler på den tabel du arbejder på, så jeg kan få det grundliggende udgangspunkt på plads...?
Avatar billede olebole Juniormester
30. august 2006 - 09:35 #26
- om det er dette, ved jeg ikke ... men det bør ikke virke:
    var Marked = new Array;

Der skal stå:
    var Marked = new Array();
Avatar billede olebole Juniormester
30. august 2006 - 09:53 #27
- og under XHTML skal events sættes med henholdsvis 'attachEvent' og 'addEventListener':

function setEventListener(o, evnt, func) {
    if (o.attachEvent) {
        o.attachEvent("on"+evnt, func);
    } else {
        o.addEventListener(evnt, func, false);
    }
}

// Kaldet kan f.eks. se sådan ud:
setEventListener(rows[i], "mouseover", function(){setClassName(this, getClassName(this) + ' hover');});
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 10:10 #28
for lige at sætte det ind som næsten virker hos mig:

var Marked = new Array;

function markRows()
{
  var rows = document.getElementsByTagName('tr');
  for ( var i = 0; i < rows.length; i++ )
  {
    if ( 'odd' != rows[i].className.substr(0,3) && 'even' != rows[i].className.substr(0,4) )
    {
      continue;
    }

    if ( navigator.appName == 'Microsoft Internet Explorer' )
    {
      // but only for IE, other browsers are handled by :hover in css
      rows[i].onmouseover = function()
      {
        this.className += ' hover';
      }
      rows[i].onmouseout = function()
      {
        this.className = this.className.replace( ' hover', '' );
      }
    }

    rows[i].onmousedown = function()
    {
      var unique_id;
      var row;
      alert('test');
      row = this.getElementsByTagName( 'input' )[0];
      //alert(row.type); // så dør den!
     
      if ( row && row.type == 'hidden' )
      {
      alert('test1'); //her går den hen i opera og IE
        unique_id = row.value;
      }
      else if ( this.id.length > 0 )
      {
      alert('test2');
        unique_id = this.id;
      }
      else
      {
      alert('test3'); //her havner den i FF
        return;
      }

      if ( typeof(Marked[unique_id]) == 'undefined' || !Marked[unique_id] )
      {
        Marked[unique_id] = true;
      }
      else
      {
        Marked[unique_id] = false;
      }

      if ( Marked[unique_id] )
      {
        this.className += ' marked';
        getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
      }
      else
      {
        this.className = this.className.replace(' marked', '');
        document.getElementById('SelectMenu').innerHTML = '';
      }
    }

   
  }
}
window.onload=markRows;
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 10:11 #29
olebole >> det var ikke dette:
- om det er dette, ved jeg ikke ... men det bør ikke virke:
    var Marked = new Array;

Der skal stå:
    var Marked = new Array();
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 10:16 #30
mine tabeller:
<table class='sortable' id='queue_today_list' name='queuelist' width='750'>
          <tr>
            <th width='160'>navn    </th>
            <th width='160'>navn 2  </th>
            <th width='80' >Time    </th>
            <th width='75' >Status  </th>
            <th width='85' >felt    </th>
            <th width='120'>felt    </th>
            <th width='70' >felt    </th>
          </tr>
          <tr class='odd'>
            <input type='hidden' name='10' value='10' id='10'>
            <td class='listlink'> <label for='10'> navn 1    </label></td>
            <td class='listlink'> <label for='10'> navn 2    </label></td>
            <td class='listlink'> <label for='10'> 18:37:00  </label></td>
            <td class='listlink'> <label for='10'> Status    </label></td>
            <td class='listlink'> <label for='10'> felt      </label></td>
            <td class='listlink'> <label for='10'> felt      </label></td>
            <td class='listlink'> <label for='10'> felt      </label></td>
          </tr>
         
          <tr class='even'>
            <input type='hidden' name='9' value='9' id='9'>
            <td class='listlink'> <label for='9'> navn 1    </label></td>
            <td class='listlink'> <label for='9'> navn 2    </label></td>
            <td class='listlink'> <label for='9'> 18:37:00  </label></td>
            <td class='listlink'> <label for='9'> Status    </label></td>
            <td class='listlink'> <label for='9'> felt      </label></td>
            <td class='listlink'> <label for='9'> felt      </label></td>
            <td class='listlink'> <label for='9'> felt      </label></td>
          </tr>
         
          <tr class='odd'>
            <input type='hidden' name='6' value='6' id='6'>
            <td class='listlink'> <label for='6'> navn 1    </label></td>
            <td class='listlink'> <label for='6'> navn 2    </label></td>
            <td class='listlink'> <label for='6'> 18:37:00  </label></td>
            <td class='listlink'> <label for='6'> Status    </label></td>
            <td class='listlink'> <label for='6'> felt      </label></td>
            <td class='listlink'> <label for='6'> felt      </label></td>
            <td class='listlink'> <label for='6'> felt      </label></td>
          </tr>
         
          <tr class='even'>
            <input type='hidden' name='7' value='7' id='7'>
            <td class='listlink'> <label for='7'> navn 1    </label></td>
            <td class='listlink'> <label for='7'> navn 2    </label></td>
            <td class='listlink'> <label for='7'> 18:37:00  </label></td>
            <td class='listlink'> <label for='7'> Status    </label></td>
            <td class='listlink'> <label for='7'> felt      </label></td>
            <td class='listlink'> <label for='7'> felt      </label></td>
            <td class='listlink'> <label for='7'> felt      </label></td>
          </tr>
          </table>
Avatar billede softspot Forsker
30. august 2006 - 10:17 #31
Jeg ville egentlig hellere se (et udsnit af) den HTML som koden arbejder på...
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 10:18 #32
det der ikke virker er at linien ikke bliver markeret når der klikkes på den i FF (1.5.0.6) og dermed udføres dette ikke:
if ( Marked[unique_id] )
      {
        this.className += ' marked';
        getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
      }
men som det ses i ovenstående kode, så går det galt meget tidligere.
Avatar billede softspot Forsker
30. august 2006 - 10:27 #33
Jeg har lige lavet en ultralet debugversion af mit forslag og det lader til at der bliver markeret noget og at disse markeringer bliver registreret i Marked-arrayet. Jeg har lavet en dummy-funktion til getContent, da jeg ikke synes det er relevant at lave en server-dims, der kan returnere data for at få frontend til at fungere... det har i det mindste ikke meget med det aktuelle problem at gøre - såvidt jeg kan se.

Det ser ud til at fungere nogenlunde i FF 1.5.0.6 og IE (markring og afmakering af linier, samt hovereffekt):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Titel</title>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<style type="text/css" rel="stylesheet">
  .even { background-color: white; }
  .odd { background-color: #efefef; }
  tr:hover, .hover { background-color: blue; }
  .marked { background-color: lightblue; }
</style>
<script type="text/javascript">
  var Marked = new Array();
  var uA = navigator.userAgent.toLowerCase();
     
  function markRows()
  {

    var rows = document.getElementsByTagName('tr');
    for ( var i = 0; i < rows.length; i++ )
    {

      if ( 'odd' != getClassName(rows[i]).substr(0,3) && 'even' != getClassName(rows[i]).substr(0,4) ) {
        continue;
      }

      if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1)
      {
        // but only for IE, other browsers are handled by :hover in css
        rows[i].onmouseover = function() { setClassName(this, getClassName(this) + ' hover'); }
        rows[i].onmouseout  = function() { setClassName(this, getClassName(this).replace( ' hover', '' )); }
      }

      rows[i].onmousedown = function() {
        var unique_id;
        var row;

        row = this.getElementsByTagName( 'input' )[0];
        if ( row && row.type == 'hidden' ) {
          unique_id = row.value;
        }
        else if ( this.getAttribute("id").length > 0 ) {
          unique_id = this.getAttribute("id");
        }
        else {
          alert('Rækken havde ikke noget ID');
          return;
        }

        if ( typeof(Marked[unique_id]) == 'undefined' || !Marked[unique_id] ) {
          Marked[unique_id] = true;
        }
        else {
          Marked[unique_id] = false;
        }

        if ( Marked[unique_id] ) {
          setClassName(this,getClassName(this) + ' marked');
          getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
        }
        else {
          setClassName(this, getClassName(this).replace(' marked', ''));
          document.getElementById('SelectMenu').innerHTML = '';
        }
       
        document.getElementById('SelectMenu').innerHTML = Marked.join(",");
      }
    }
  }
  window.onload=markRows;

  function getContent() {
    return "";
  }
 
  function getClassName(obj) {
    if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1) {
      return obj.className;
      return obj.getAttribute("className");
    }
    else {
      return obj.getAttribute("class");
    }
  }

  function setClassName(obj, value) {
    if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1) {
      obj.className = value;
      //obj.setAttribute("className", value);
    }
    else {
      obj.setAttribute("class", value);
    }
  }
</script>
</head>

<body>

<table>
  <tr class="odd" id="1">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="even" id="2">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="odd" id="3">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="even" id="4">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="odd" id="5">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
  <tr class="even" id="6">
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>kahsdkjhaasd</td>
  </tr>
</table>

<div id="SelectMenu"></div>
</body>
</html>
Avatar billede softspot Forsker
30. august 2006 - 11:07 #34
Mht. kun at have en række valgt ad gangen, så prøv at indsætte denne kode i markRows-funktionen (på den relevante position, dvs. den erstatter den kode som definerer den nuværende onmousedown):

      rows[i].onmousedown = function() {
        var objCurrent = (CurrentMark ? document.getElementById(CurrentMark) : null);
        var unique_id;
        var row;

        row = this.getElementsByTagName( 'input' )[0];
        if ( row && row.type == 'hidden' ) {
          unique_id = row.value;
        }
        else if ( this.getAttribute("id").length > 0 ) {
          unique_id = this.getAttribute("id");
        }
        else {
          return;
        }

        if ( unique_id != CurrentMark ) {
          CurrentMark = unique_id;
        }
        else {
          CurrentMark = null;
        }

        if ( CurrentMark ) {
          setClassName(this,getClassName(this) + ' marked');
          getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
        }
        else {
          setClassName(this, getClassName(this).replace(' marked', ''));
          document.getElementById('SelectMenu').innerHTML = '';
        }

        if(objCurrent) {
          setClassName(objCurrent, getClassName(objCurrent).replace(' marked', ''));
        }       
      }


Du skal desuden udskifte denne linie

  var Marked = new Array();

med denne:

  var CurrentMark = null;
Avatar billede softspot Forsker
30. august 2006 - 11:07 #35
Det er testet i FF og IE og ser ud til at fungere...
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 11:26 #36
godt nok... nu virker det endelig i Firefox, men det var ikke den fejl jeg selv troede det var, det var fejl i tabellerne, idet at det er tr der skal have et id og det glemte jeg vist at sætte på (som i også kan se da jeg postede dem)
sorry, tror ikke jeg var rigtig vågen der ! ups, øv...

Så problemet lå slet ikke i mit js... men tak for de forslag i har lavet til det også. Jeg kan bare ikke lige bestemme mig for om det er en god ide at bruge det når nu at det andet også virker fortrinneligt!
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 11:26 #37
jeg prøver lige din nye onmousedown ...
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 11:39 #38
perfekt... nu virker det hele ... jeg vil gerne give points nu... det er softspot der har hjulpet mest, men olebole har vel også hjulpet? hvad siger i til 40/20 fordeling? ellers kom lige med et forslag...

jeg fordeler når begge har svaret ;)

tusind tak.
Avatar billede olebole Juniormester
30. august 2006 - 11:43 #39
Ja, mit forslag er 60 til softspot. Jeg kom bare med lidt smårettelser - og har ikke tid til mere for tiden ... men tak for tanken  ;o)
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 11:52 #40
np... så venter jeg bare et svar fra softspot...

men tak alligevel...
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 12:04 #41
lige et sidste problem:
        if(objCurrent)
        {
        alert(getClassName(objCurrent)); // denne alert giver altid Null i FF dermed bliver de andre linier ikke "afmarkeret" ? er det mig der laver en bøv her?
          setClassName(objCurrent, getClassName(objCurrent).replace(' marked', ''));
        }
Avatar billede olebole Juniormester
30. august 2006 - 12:45 #42
Hvad sker der, når du skriver:

        if(objCurrent)
        {
        alert(objCurrent); // denne alert giver altid Null i FF dermed bliver de andre linier ikke "afmarkeret" ? er det mig der laver en bøv her?
          setClassName(objCurrent, getClassName(objCurrent).replace(' marked', ''));
        }

I øvrigt er der lidt levninger her:

  function getClassName(obj) {
    if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1) {
      return obj.className;
      return obj.getAttribute("className");
    }
    else {
      return obj.getAttribute("class");
    }
  }

Den bør se sådan ud:

  function getClassName(obj) {
    if (uA.indexOf("msie")!=-1 && uA.indexOf("opera")==-1) {
      return obj.getAttribute("className");
    }
    else {
      return obj.getAttribute("class");
    }
  }

- men det er ikke det, der giver dig problemer  :)
Avatar billede softspot Forsker
30. august 2006 - 13:19 #43
Jeg har kun testet med et id på et TR-element og ikke med en hidden input, så den del havde jeg ikke taget højde for. Jeg har ændret onmousedown-rutinen, så den nu også håndterer dette:

      rows[i].onmousedown = function() {
        var objPrevMark = objCurrentMark;
        var unique_id;
        var row;

        row = this.getElementsByTagName( 'input' )[0];
        if ( row && row.getAttribute("type") == 'hidden' ) {
          unique_id = row.value;
        }
        else if ( this.getAttribute("id").length > 0 ) {
          unique_id = this.getAttribute("id");
        }
        else {
          return;
        }

        if ( this != objCurrentMark ) {
          objCurrentMark = this;
        }
        else {
          objCurrentMark = null;
        }

        if ( objCurrentMark ) {
          setClassName(this,getClassName(this) + ' marked');
          getContent('resources/getFromScheduled.php', '?Id='+unique_id, 'SelectMenu');
        }
        else {
          setClassName(this, getClassName(this).replace(' marked', ''));
          document.getElementById('SelectMenu').innerHTML = '';
        }

        if(objPrevMark) {
          setClassName(objPrevMark, getClassName(objPrevMark).replace(' marked', ''));
        }       
      }


Desuden skal du ændre

  var CurrentMark = null;

til

  var objCurrentMark = null;

(...bare en lille flueknepperting at ændre variabel-navnet)
Avatar billede softspot Forsker
30. august 2006 - 13:25 #44
Du kan lige få det svar du bad om tidligere... :)
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 13:30 #45
okay jeg vil lige prøve at opdatere det...
Avatar billede ferrari_brian Nybegynder
30. august 2006 - 13:34 #46
super... så virker det... tak for det ! :)
Avatar billede softspot Forsker
30. august 2006 - 14:12 #47
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester