javascript - 使用 onclick 传递变量

标签 javascript variables onclick

我的页面上有一本书由 3 个 iframe 组成,1 个 iframe 打开目录,2 个 iframe 同时打开 2 个页面,我还有 2 个按钮通过此功能导航下一页和上一页

var pNum = 1;
var pNum2 = 2;
var maxPage = 108;
pNum = pNum+2;
pNum2 = pNum2+2;
if (pNum > maxPage) {pNum=1;pNum2=2;}
    document.getElementById("Frame_C").src="page"+pNum+".jpg";
    document.getElementById("Frame_B").src="page"+pNum2+".jpg";
}
function prev(){
    pNum = pNum-2;
    pNum2 = pNum2-2;
    if (pNum < 1) {pNum=107;pNum2=108;}
        document.getElementById("Frame_C").src="page"+pNum+".jpg";
        document.getElementById("Frame_B").src="page"+pNum2+".jpg";
} 

如果我点击目录中的链接,它会打开包含该链接的 2 个页面

<td>
 <p class=Mmenu>
  <a href="page36.jpg" target="Frame_C" onClick="window.open('page37.jpg','Frame_B')">whatever</a>
</td>

问题从这里开始,如果我点击 next-previous 按钮,我希望它从第 36,37 页继续,但是它从函数中的 pNum 继续会发生什么,如何从 onclick 更新 pNum ?或者另一种解决方案!

最佳答案

您遇到麻烦是因为您的“无论什么”链接正在改变您的 prev() 函数期望不会被弄乱的状态。

当一个人有某种状态时(例如,一些变量代表一本书的页面),重要的是不要违反表示不变量内部表示。因此

Everything that touches the book should keep its internal state consistent.

编写这种情况的一种好方法是创建一组特殊的接口(interface)函数,以确保状态一致(在下面通过单个函数 gotoPage 进行演示,该函数确保一切都保持整洁;可以使用更多不是一个单一的功能,但他们每个人都需要保持整洁)。

首先必须为内部状态提出您想要的规则。在下面的示例中,规则是“rightPage 始终等于 leftPage+1,并且 iframe 始终显示 leftPage.jpg 和 rightPage.jpg,除非它是无效页面,在这种情况下 iframe 显示 about:blank”。

试试这个:

function $id(id) {
    return document.getElementById(id);
}

/*
    internal representation
    these values changed only by the gotoPage function
    invariant:
        - rightPage is always equal to leftPage+1
        - iframes always show leftPage.jpg and rightPage.jpg, 
          except if it's an invalid page, in which case that 
          iframe shows an about:blank
*/
var leftPage = 0; // page0 is blank
var rightPage = 1; // must always be equal to leftPage+1; which may be an invalid page
var PAGE_MAX = ???;
function gotoPage(num) {
    if (num<0)
        num = 0;
    if (num>PAGE_MAX)
        num = PAGE_MAX; // may need to think about this some more

    // most books seem to put even pages on left and odd on right
    function isEven(n) {
        return n%2==0; // sidenote: abs(n%2)==1 -> odd
    }
    leftPage = isEven(num) ? num : num-1;
    rightPage = leftPage+1;

    updateDisplay();
}

function prev() {
    gotoPage(leftPage-2);
}
function next() {
    gotoPage(leftPage+2);
}
function gotoPageByGuess(elem) {
    var pageNum = parseInt(elem.innerHTML.slice(-2));
    gotoPage(pageNum);
}

function updateDisplay() {
    // using jquery
    $id('leftPage').src = 'page'+leftPage+'.jpg';
    if (rightPage <= PAGE_MAX)
        $id('rightPage').src = 'page'+rightPage+'.jpg';
    else
        $id('rightPage').src = 'about:blank';            
}

那么不要使用常规的 href 或 target,而是这样做:

<a onclick="prev()">Previous</a>
<a onclick="next()">Next</a>

然后您可以执行以下任一操作,具体取决于哪个最简单:

<a onclick="gotoPage(26)">Chapter 2: Some Title......... p26</a>
<a onclick="gotoPageByGuess(this)">Chapter 2: Some Title......... p26</a>

编辑:删除了 with(Math){...} 语句,它允许您使用像 abs() 这样的数学函数,而无需冗长地调用 Math.abs()

关于javascript - 使用 onclick 传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5694105/

相关文章:

javascript - 当某些节点被删除时更新 D3 树

javascript - 如何在 angularjs 中的 md-list-item 中临时添加值?

javascript - 如何在ajax调用之前定义变量

javascript - Canvas - 单击时分离 2 个行数组

javascript - 如何使用jquery删除靠近父级的相似HTML标签?

javascript - 在一个函数中,在变量之前使用/不使用 var 会发生什么?

c# - 指数运算符

javascript - 增加javascript中使用的php变量

java - OnClick在其他JAVA文件Android中加载数组

javascript - 如何使用内联 HTML onclick 和 jQuery 获取被点击的元素?