こういう感じではどうでしょうか。
iframeのガワ(外)
HTML
1<body>
2<script>
3childFunctions = []; // 子フレームの関数を保存する配列
4function setChildFunction(name, fn) { // iframeの中から呼び出されて関数テーブルをセットする
5 childFunctions[name] = fn;
6}
7</script>
8<input type="button" value="ボタン1" onclick="childFunctions.x1()"><br>
9<input type="button" value="ボタン2" onclick="childFunctions.x2()"><br>
10<input type="button" value="ボタン3" onclick="childFunctions.x3()"><br>
11<iframe src="child.html" id="iframe"></iframe>
12</body>
iframeの内(child.html)
HTML
1<body>
2<div id="c"></div>
3<script>
4parent.setChildFunction('x1', function() { // 親のsetChildFunction を呼び出す
5 document.getElementById('c').textContent = 'x1';
6});
7parent.setChildFunction('x2', function() {
8 document.getElementById('c').textContent = 'x2';
9});
10parent.setChildFunction('x3', function() {
11 document.getElementById('c').textContent = 'x3';
12});
13</script>
14</body>
(追記 2020/12/21)
以下ではどうでしょうか? 関数とボタンの両方をiframeの外に持ち出しました。内側のボタンとJavaScriptは、なくても動きます。
iframeのガワ(外)
HTML
1<body>
2<script>
3function b1() {
4 // 関数 c1 をiframeの外側に持ち出した
5 // iframeの document取り出し
6 var childDoc = document.getElementById('iframe').contentDocument;
7 // iframe内のDOM操作
8 childDoc.getElementById('c').textContent = 'b1';
9}
10</script>
11<input type="button" value="ボタン1" onclick="b1()"><br> <!-- 外側のボタン -->
12<iframe src="child.html" id="iframe"></iframe>
13</body>
iframeの内(child.html)
HTML
1<body>
2<input type="button" value="ボタン1" onclick="c1()"/><br> <!-- 内側のボタン -->
3<script>
4function c1() {
5 // iframe内のDOM操作
6 document.getElementById('c').textContent = 'c1';
7}
8</script>
9<div id="c"></div>
10</script>
11</body>
(追記 2020/12/21 12:40)
コメント見ました。
iframeの内側のボタンのみを複製するスクリプトを書いてみました。JavaScriptを外側に移すとなるとオオゴトだと思います(プロパティも変更しないといけない)ので、それはやっていません。
iframeのガワ(外)
HTML
1<body>
2<div id="b"></div>
3<script>
4function importButton(bName) { // ボタンを複製して配置。bName はボタンのID
5 const oldNode = document.querySelector("iframe").contentWindow.document.getElementById(bName);
6 const newNode = document.importNode(oldNode, true); // 複製ノードを作る
7 newNode.onclick = oldNode.onclick; // onclickイベントをコピーする
8 oldNode.style.display ="none"; // iframe内の元のボタンは非表示にする
9 pNode = document.getElementById("b").parentNode;
10 pNode.insertBefore(newNode, pNode.firstElementChild); // 複製したノードをインサートする
11}
12window.onload=function(){
13 importButton('btn_b');
14 importButton('btn_a');
15}
16</script>
17<iframe src="311122c.html" id="iframe"></iframe>
18</body>
iframeの内(child.html)
HTML
1<body>
2<script>
3function a(){
4 alert("フレーム内のalert(a)");
5}
6function b(){
7 alert("フレーム内のalert(b)");
8}
9</script>
10<input id="btn_a" type="button" value="ボタン(btn-a)" onclick="a()">
11<input id="btn_b" type="button" value="ボタン(btn-b)" onclick="b()">
12</body>